您的位置 首页 java

「每日一题」二分查找

题目:

给定一个 n 个元素有序(升序)的整型数组 nums, 和一个目标值 target ,写一个函数搜索nums中的target,如果目标值存在,返回下标,否则返回 -1

解题( Java ):

 class Solution {
    public int search(int[] nums, int target) {
        int firstIndex = 0;
        int lastIndex = nums.length - 1;
        
        while(firstIndex <= lastIndex){
            int index = (lastIndex + firstIndex ) / 2;
            int num  = nums[index];
            if(target == num){
                return index;
            }else if(target > num){
                //取后半部分较大的值
                firstIndex = index + 1;
            }else {
                //取前半部分较小的值
                lastIndex = index - 1;
            }
        }
        return -1;
    }
}  

思路解析:

题目规定数组为有序且不存在重复元素,这就符合了 二分查找 的前提(在工作中可以注意存在这种情况可以考虑二分查找)
二分查找逻辑简单,主要考虑的就是边界问题
1、什么时候需要停止对数组的分割?其中一种思路是
左边界大于右边界 的时候。所以上面解题代码while中写的是first <= last
2、边界的转移问题:如果目标值大于数组选中的值,则说明目标值存在于右半部分,则需要挪动左边界下标,即firstIndex,需要把当前二分的下标index赋值给firstIndex,但这里为什么要+1呢,很简单,因为index这个值已经比较过了,所以firstIndex应该再次向右移动一位,同理如果目标值小与数组选中的值,说明目标值存在左半部分,即需要lastIndex = index – 1.

文章来源:智云一二三科技

文章标题:「每日一题」二分查找

文章地址:https://www.zhihuclub.com/199453.shtml

关于作者: 智云科技

热门文章

网站地图