前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法(六) 二分查找

算法(六) 二分查找

作者头像
宇宙无敌暴龙战士之心悦大王
发布2022-01-10 11:24:39
3810
发布2022-01-10 11:24:39
举报
文章被收录于专栏:kwaikwai

最基本的算法,常用于比较目标值和数组中间元素。时间复杂度为O(logN)。

1,例题

1,二分查找

来自LeetCode704

  • 最最简单的二分题了,,,,面试热度那么高闹哪样呢,,,,
解法
代码语言:javascript
复制
class Solution {
    public int search(int[] nums, int target) {
        int middle;
        int left = 0;
        int right = nums.length - 1;
        while(left<=right){
            middle = left + (right - left)/2;
            if(nums[middle] == target) 
                return middle;
            else if(nums[middle] < target){
                left = middle + 1;
            }
            else
                right = middle - 1;
        }
        return -1;
    }
}

务必注意二分式子,不可以(left+right)/2。

理解

1,二分式子不可以直接 middle = (left+right)/2,这样遇到nt测试用例,可能加起来会溢出。不过这个式子也并非原始式子。

原始式子应该是middle = left + (left - right)/2,这能体现中间值的过程,也能防止溢出问题。

2,x的平方根

来自LeetCode69

  • 计算机的方法很简单
  • 数学方法真特么难啊,还好没学数学(牛顿迭代法)
解法
代码语言:javascript
复制
class Solution {
    public int mySqrt(int x) {
        if(x==0||x==1)
            return x;
        int l = 0;
        int r = x;
        int res = -1;;
        while(l<=r){
            int middle = l + (r - l)/2;
            if(x/middle<middle){
                r = middle-1;
            }
            else if(x/middle>middle){
                l = middle+1;
                if(x/(middle+1)<(middle+1))
                    return middle;
            }
            else
                return middle;
        }
        return -1;
    }
}

务必注意二分式子,不可以(left+right)/2。

理解

1,有空可以学习一下这题的数学思想,牛顿迭代法。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1,例题
    • 1,二分查找
      • 解法
      • 理解
    • 2,x的平方根
      • 解法
      • 理解
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档