题意:

  • 给定数组和目标值,利用二分查找在数组中寻找目标值。

方法一:

解题思路:

  • 首先用leftright表示查找范围,用mid=(left+right)/2进行二分查找,如果nums[mid]==target,则直接返回mid;如果nums[mid]>target,则将right更新为mid;如果nums[mid]<target,则将left更新为mid
  • 边界条件:1.如代码16行,能有效判断数组只有一个数的情况,以及剪枝。2.当数组中仅剩两个数时,直接判断这两个数中是否存在等于target的。

代码如下:

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int search(vector<int>& nums, int target) {
        // write code here
        int left=0,right=nums.size()-1;
        while(left<=right){
            //目标值不存在的情况
            if(nums[right]<target||nums[left]>target)
                return -1;
            //当判断的数只有两个时的情况讨论
            if(left==right-1){
                if(nums[left]==target)
                    return left;
                if(nums[right]==target)
                    return right;
                return -1;
            }
            //二分查找
            int mid=(left+right)/2;
            if(nums[mid]==target)
                return mid;
            else if(nums[mid]>target)
                right=mid;
            else
                left=mid;
        }
        return -1;
    }
};

图解如下:

alt

复杂度分析:

时间复杂度:O(logn)O(log_{}{n})O(logn),二分法查找。

空间复杂度:O(1)O(1)O(1),仅常数个临时变量。