今天回顾了下二分法,在leetcode写了三个简单题,主要是要确定围绕mid(中间值)的几个if语句的作用,同时还要注意一些细节问题,如力扣367. 有效的完全平方数
我的思路是left和right分别指向1和num本身,然后通过left和right的中间值mid的平方与num的大小关系来更新mid位置,如果是mid^2<num,那么说明平方数肯定在mid右边,mid^2>num,则在mid左边,剩下一种情况也就是相等,意味着mid就是num的完全平方数,当left>right时,也就说明没有符合的数,返回false即可。
但是要注意几个问题:
- num的最大值为2^31-1,mid*mid最开始的结果绝对会超出int的数据范围,所以对mid*mid<num可以写成mid<num/mid,但是这里要注意else代表的原情况(mid*mid==num)转换成mid==num/mid时造成的精度丢失,因为int之间的除法是不计小数部分的,这会导致这两个等式其实不等价,例如num=5,当mid=2时,mid*mid==num的结果是false,但是mid==num/mid的结果是true,所以遇到else的情况时,应该return (mid*mid==num)再判断一下,而不是单纯的return true
- 接1,遇到else的情况时,return (mid*mid==num),照我上面所说的如果数据很大时,mid*mid不会溢出吗?这里要清楚return (mid*mid==num)的前提是mid=num/mid,这说明mid要么是num的完全平方数,要么是比平方数略小一点的数,此时mid*mid<=num的,所以完全不会溢出
这个题虽然不难,但是需要处理溢出的问题,要细心一点qwq
今天写了一道滑动窗口的题,但是还没写出来,明天继续加油!