11.24算法学习打卡

  今天回顾了下二分法,在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即可。

 但是要注意几个问题:

  1. 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
  2. 接1,遇到else的情况时,return (mid*mid==num),照我上面所说的如果数据很大时,mid*mid不会溢出吗?这里要清楚return (mid*mid==num)的前提是mid=num/mid,这说明mid要么是num的完全平方数,要么是比平方数略小一点的数,此时mid*mid<=num的,所以完全不会溢出

这个题虽然不难,但是需要处理溢出的问题,要细心一点qwq

今天写了一道滑动窗口的题,但是还没写出来,明天继续加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值