当前位置: 首页 > wzjs >正文

邯郸贴吧网站如何建立免费个人网站

邯郸贴吧网站,如何建立免费个人网站,做质粒图谱的网站,cnd中国设计网文章目录 不使用sqrt函数情况下求平方根整数部分暴力求解解题思路代码实现int的上溢出风险利用不等式性质调整边界强制类型转换到更长字节的整形 时间复杂度和空间复杂度 二分查找算法思路代码实现时间复杂度和空间复杂度 不使用sqrt函数情况下求平方根整数部分 本篇文章是对Le…

文章目录

  • 不使用sqrt函数情况下求平方根整数部分
    • 暴力求解
      • 解题思路
      • 代码实现
        • int的上溢出风险
        • 利用不等式性质调整边界
        • 强制类型转换到更长字节的整形
      • 时间复杂度和空间复杂度
    • 二分查找
      • 算法思路
      • 代码实现
      • 时间复杂度和空间复杂度

不使用sqrt函数情况下求平方根整数部分

本篇文章是对Leetcode 69题目进行记录

现在提供以下两种思路:

  1. 暴力求解
  2. 二分查找

以下我们将对这两种算法进行记录,原题链接:
Leetcode 69.x的平方根

暴力求解

几乎所有的题,我们第一时间都想到的是能不能暴力求解,先不管时间复杂度的要求。当然这题是没有要求的,我们可以先试着写一下暴力求解的思路。

解题思路

因为只需要求的是整数x(int 类型)的平方根的整数部分,使用暴力求解是非常简单的。定义int i = 1;只需要让i从1开始遍历到x,i2只要小于等于x就继续往下走,直到大于的时候返回i - 1这个值即可。思路十分简单。

代码实现

int的上溢出风险
class Solution {
public:int mySqrt(int x) {if (!x)return x;int sqrtx = 1;//专门用来接收平方根的整数部分for (int i = 1; i <= x; i++) {if (i * i <= x)sqrtx = i;elsebreak;}return sqrtx;}
};

很多人会不假思索地写出这么一段代码。但是忽略了一个问题就是上溢出的风险。

对于int类型,其实是unsigned int类型,是有符号整形,最大值应该是231 - 1 = 2147483647才对。当i从1开始遍历,一开始i比较小,那么i2的值肯定是可以用int接收的(本身i * i都是int类型,算出来也是int类型)。

但是我们尝试着跑一下这个代码:
在这里插入图片描述
执行是出错的,看到错误原因是当i = 46341的时候,i * i的值是无法作为int类型数据和比较的,所以得进行修改代码。

利用不等式性质调整边界

通过计算器计算得知:46431 * 46431 = 2155837761是大于int类型数据的最大值的。也就是说,对于x来讲,无论多大,只要是再int范围内,最多i只需要遍历到46431就会停下,只不过这个时候会导致上溢出风险。

我们学过不等式:

if a < b
then a * c < b * c (c != 0)

既然只有i = 46431的时候会导致平方越界,那么两边同时乘一个0.5不就好了,这样子还会把计算后的结构类型提升到double类型,就可以比较了,一定不会越界:

class Solution {
public:int mySqrt(int x) {if (!x)return x;int sqrtx = 1;//专门用来接收平方根的整数部分for (int i = 1; i <= 0.5 * x; i++) {if (0.5 * i * i <= 0.5 * x)sqrtx = i;elsebreak;}return sqrtx;}
};
强制类型转换到更长字节的整形

这个前提是题目没有要求说题目中不给使用64位的整形数据。

既然int比较不了,那直接类型提升到long long不就可以了吗?

class Solution {
public:int mySqrt(int x) {if (!x)return x;int sqrtx = 1;for (int i = 1; i <= 0.5 * x; i++) {if ((long long)i * i <= x)sqrtx = i;elsebreak;}return sqrtx;}
};

时间复杂度和空间复杂度

在这里插入图片描述
我们看看经过修改后的代码(调整边界方法时间和这个差不多)

时间复杂度为O(LogX),其实很好理解,如果x比较大,那么跑的次数会非常接近刚刚的那个数46431,其实也就是x的平方根整数部分,那效率还是比较低的。

空间复杂度为O(1),因为该算法没有另外开辟空间。

二分查找

既然暴力求解是从1开始找到x,那么就是在一个有序的序列上找一个确定的数,那么我们可以尝试一下使用二分查找。

算法思路

我们可以尝试一下二分查找。刚刚我们也知道int类型数据内找平方根最大也就到46431就会越界,所以我们可以控制一下查找的范围,就定在1~50000即可。

二分查找就是在1~50000中查找:
定义一个变量上界为int up ,下届为int down。设中间数为int mid

mid = (up + down) / 2。开始查找:
如果当前mid * mid的值和x相同,那就返回 mid这个值。
如果小于就让mid为下界,即赋值给down,重新计算mid
如果大于就让mid为上界,即赋值给up,重新计算mid

但是不是所有的数都能找到整数平方根,但是二分查找会不断压缩直到只有一个数,此时mid的值和down是一样的,那就直接停止循环即可。

但是每个数字都从50000开始为上界还是太慢了。就比如我要找10的平方根,从10开始找才是更快的,从50000开始为上界那就不太行了。但是int所有类型的数据最大的平方根也不超过50000,所以我们做一个规定,如果传入的x小于等于50000,就让上界为x,反之为50000。

我们以60作为例子:
在这里插入图片描述
很明显,这个思路是可行的。现在还有一个问题就是对于0这个数是否也能用这个逻辑呢?

如果x == 0,上界为0,下界为1,那么中间数就是0。然后当前中间数偏小,就让0为下届,原本的上界0仍是上界,再计算此时的mid也是0。还是偏小。但是此时middown的值相同,直接退出循环就可以了。所以也是可以成功的。

代码实现

class Solution {
public:int mySqrt(int x) {// 此时mid大约为2.9wint up = (x <= 50000) ? x : 50000, down = 1;int mid = (up + down) / 2;while (mid != down) {// 乘0.5是防止越界int的范围if (0.5 * mid * mid == 0.5 * x)return mid;else if (0.5 * mid * mid > 0.5 * x)up = mid;elsedown = mid;mid = (up + down) / 2;}return mid;}
};

当然还是需要注意上溢出风险的。具体处理方法可以参照上个部分讲的两种解决方案。

时间复杂度和空间复杂度

很明显空间复杂度仍是O(1),因为没有另外开辟空间进行操作。
时间复杂度仍为O(LogX),这个看着和上面那个算法的O(LogX)好像没什么区别,实则不然。

虽然二者查找次数均为LogX次,但是也是有区别的。特别数字比较大的时候。当数字较大,暴力查找是要从1到x的平方根跑满的,而二分查找却不用那么多次。

就比如找90000的平方根,暴力查找要找300次,而二分查找只需要14次(大致计算),这个效率差是非常大的。

http://www.dtcms.com/wzjs/67470.html

相关文章:

  • 网站建设宣传公司网站seo公司
  • 网站做第三方登录网络营销好找工作吗
  • 松江公司做网站2345浏览器网址
  • 网站中的搜索功能怎么做的百度推广竞价
  • mc做地图画网站国产免费crm系统有哪些
  • 建网站要去备案b站刺激战场视频
  • 安卓app开发模板关键词seo排名怎么做的
  • 客户如何找到做网站宣传的律师公司网站seo外包
  • 做ppt网站有哪些内容吗怎么能在百度上做推广
  • 装饰设计师工资一般多少网站推广优化业务
  • 建设网站的必要性个人博客
  • 找人做网站安全吗zac博客seo
  • 驾校做网站百度seo排名公司
  • 建立b2b企业网站软件外包企业排名
  • 搞一个网站要多少钱关键词在线试听
  • 西数网站管理助手注册域名查询网站官网
  • 南昌市网站建设推广比较好的搜索引擎
  • 杭州网站建设hzfwwl一键优化下载安装
  • 上海出啥大事了吴忠seo
  • 常州建设局考试网站上海seo网站优化
  • 广州有什么好玩的东西北京排名seo
  • 北控水务建设发展有限公司网站网络推广需要多少费用
  • 硬盘做免费嗳暧视频网站seo最新
  • 2级a做爰片免费网站百度网址安全检测
  • 东莞网站建设需要多少钱51外链代发网
  • 水果网站推广镇江seo
  • 武汉网站建设工作室外国人b站
  • 小程序可视化开发工具泰安网站seo推广
  • 山西中小学网站建设世界排名前十位
  • 怎么做 废旧回收网站网络测试