基本思路:定义一个查找范围,每次比较差找范围的中点值与目标值的大小,如果不相等则缩小查找范围。

题目分析:

1.nums是一个升序数组,即每一个元素比后一个元素小。

2.nums是一个左闭右闭的区间。(n 将在 [1, 10000]之间)

易错点:

1.while循环条件中的取等问题

若所给区间是左闭右闭则取等,即while(left<=right)

若为左闭右开则不取等,即while(left<right)

2.缩小范围

若是左闭右闭区间:

当中间值大于目标值时,为了缩小右边界应为中间值减一(right=mid-1);反之缩小左边界应为中间值加一(left=mid+1)

若时左闭右开:

当中间值大于目标值时,为了缩小右边界应令左边界为中间值(right=mid);反正缩小左边界应为中间值加一(left=mid+1)

3.右边界赋值

若为左闭右闭时右边界为nums.length-1,若为左闭右开时为nums.length

class Solution {
    public int search(int[] nums, int target) {
        int left=0, right=nums.length-1;
        while(left<=right){
            int mid=(right-left)/2+left;
            int num=nums[mid];
            if(num==target){
                return mid;
            }else if(num>target){
                right=mid-1;
            }else{
                left=mid+1;
            }
        }
        return -1;
    }
}

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐