leetcode-704

57 阅读1分钟

image.png 二分法 左闭右闭

边界条件为target在最左端或者最右端
此时,left = middle = right - 1
或者  right = middle = left + 1
class Solution1{
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1;
        while(left<=right){
            int middle = left + ((right  - left)>>1);
            if(nums[middle]==target){
                return middle;
            }
            if(nums[middle]>target)
            {
                right = middle - 1;
            }
            if(nums[middle]<target)
            {
                left = middle + 1;
            }
        }
        return -1;
    }
};

二分法 左闭右开

极端条件在数组的最左端或者最右端
此时left = middle = right - 1
或者 left = middle = right - 1
左闭右闭合左闭右开最大的区别在于:
左闭右开left 永远也不不会小于right,
并且我们要设定的迭代范围left~right 为 [0,nums.size[]
class Solution{
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size();
        while(left<right){
            int middle = left + (right - left)/2;
            if(nums[middle]<target){
                left = middle + 1;
            }else if(nums[middle]>target){
                right = middle;
            }else{
                return middle;
            }
        }
        return - 1;
    }
};

暴力算法

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() -1;
        //length - 1 可能有等于0的情况
        int length = right - left + 1;
        for(int i = 0;i <= length - 1;i++){
            if(nums[i] == target){
                return i;
            }
        }
        return -1;
    }
};