代码随想录算法训练营关于二分(额外)| 69. x 的平方根 、367. 有效的完全平方数

想法:针对第一章的二分法再做一些训练

69. x 的平方根

阅读后想法:寻找第一个x*x<=target的数,用left边界来缩小;第一个target左边的数

注意:由于存在mid*mid,这里面有可能出现int类型的越界,需要通过类型转换(long long)

class Solution {
public:
    int mySqrt(int x) {
        if(x==0 || x==1) {
            return x==0?0:1;
        }

        int right = x-1;
        int left = 1;
        int ans = 1;
        while(left<=right) {
            int mid = (right+left)/2;
            if((long long)mid*mid <= x) {
                ans = mid;
                left = mid+1;
            }else {
                right = mid-1;
            }
        }
        return ans;
    }
};

367. 有效的完全平方数

想法:和上一题一样,可以通过二分进行遍历,寻找到是否有符合==target的数

class Solution {
public:
    bool isPerfectSquare(int num) {
        int right = num;
        int left = 0;

        while(left<=right) {
            int mid = (right+left)/2;
            if((long long)mid*mid==num) {
                return true;
            }else if((long long)mid*mid<num) {
                left = mid+1;
            }else {
                right = mid-1;
            }
        }
        return false;
    }
};

二分查找总结(os: 用于场景):

1. 主要用于需要查找的题目,需要判断这个数组中是否存在某个元素满足条件,又不想全部遍历,我们可以通过两边缩进的方式,来实现整个数组的搜索功能

2. 搜索数值符合,搜索位置符合(其实也是数值),搜索平方根(其实就是对数值的对比判断),搜索平方数

3. 找最后满足条件的数,这个是有点难度的,比如找满足条件(与target之间的对比关系)的第一个数(先找到一个数,满足了,再去它的右半区间-缩小left,寻找还有没有更接近-靠近target的满足数)

4. 找第一个满足的数,缩小right,找左半区间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值