栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

二分查找入门——第3天

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

二分查找入门——第3天

二分查找入门——第3天
  • 前言
  • 一、367. 有效的完全平方数
    • 1.题目
    • 2.链接
    • 3.思路
    • 4.题解
    • 5.结果
  • 二、1385. 两个数组间的距离值
    • 1.题目
    • 2.链接
    • 3.思路
    • 4.题解
    • 5.结果
  • 总结

前言

通过力扣(LeetCode)的两道例题来进一步加深二分查找

一、367. 有效的完全平方数 1.题目

2.链接
https://leetcode.cn/problems/valid-perfect-square/
3.思路

利用二分查找,从0~ num / 2 中间查找,如果满足(num+0.0)/mid == mid,则返回true,如果不满足,则判断大小,继续用二分查找,直到找到或查找完成为止。
注意:判断条件使用mid*mid == num时,应该用long类型。因为int类型会导致溢出。

4.题解

代码如下(示例):

class Solution {
    public boolean isPerfectSquare(int num) {
        if(num <= 2)
            return true;
        int left = 0;
     	//这里应该可以优化一下,使查找范围更小一点。
        int right = num/2;
        while(left <= right){
            int mid = left + (right - left)/2;
            if((num+0.0)/mid == mid){
                return true;
            }
            if(mid > (num+0.0)/mid){
                right = mid - 1;
            }
            if(mid < (num+0.0)/mid){
                left = mid + 1;
            }
        }
        return false;
    }
}
5.结果

二、1385. 两个数组间的距离值 1.题目

2.链接
https://leetcode.cn/problems/find-the-distance-value-between-two-arrays/
3.思路

先将arr2排序,在遍历arr1,利用二分查找,查找arr1中的值是否满足题目要求。
写一个函数判断一下,该函数从arr2的中间的值查找(mid),如果arr2[mid] 满足 |arr1[i]-arr2[mid]| <= d 返回false,如果不满足,且arr2[mid]>arr1[i],则在右半部查找,反之,就在左边部查找。如果没有找到,则返回true。

4.题解
class Solution {
    public int findTheDistanceValue(int[] arr1, int[] arr2, int d) {
        Arrays.sort(arr2);
        int count = 0;
        for(int i : arr1){
            if(rank(arr2, i, 0, arr2.length-1, d)){
                count++;
            }
        }
        return count++;
    }
    //key则为arr1[i]
    public boolean rank(int[] arr2,int key ,int lo, int hi, int d){
        if(hi
            return true;
        }
        int mid = lo + (hi-lo) / 2;
        if(Math.abs(arr2[mid]-key) <= d){
            return false;
        }
        if(arr2[mid] > key){
            return rank(arr2, key, lo, mid-1, d);
        }
        if(arr2[mid] < key){
            return rank(arr2, key, mid+1, hi, d);
        }
        return true;
    }
}
5.结果

总结

其实二分查找并不一定要从正中间开始分,而是尽量找到一个更接近我们要找的那个数字的地方,这样能够减少很多查找次数。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/935301.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号