Search in Rotated Sorted Array 旋转数组查找

Search in Rotated Sorted Array 旋转数组查找

No.33 在没有重复数字的升序数组中查找值并返回下标

int search(vector<int>& nums, int target) {
    int start=0;
    int end=nums.size()-1;
    while(start<=end) {
        int mid=(start+end)>>1;
        if (nums[mid]==target) return mid;
        if (nums[mid]>=nums[start]) {
            if (target<nums[mid] && target>=nums[start]) {
                end=mid-1;
            } else {
                start=mid+1;
            }
        } else {
            if (target>nums[mid] && target<=nums[end]) {
                start=mid+1;
            } else {
                end=mid-1;
            }
        }
    }
    return -1;
}

No.81 在有重复数字的升序数组中查找值并返回下标

bool search(vector<int>& nums, int target) {
    int start=0;
    int end=nums.size()-1;
    while(start<=end) {
		// 除去重复元素
        while(start<end && nums[start]==nums[start+1]) ++start;
        while(end>start && nums[end]==nums[end-1]) --end;

        int mid=(start+end)>>1;
        if (nums[mid]==target) return true;
        if (nums[mid]>=nums[start]) {
            if (target<nums[mid] && target>=nums[start])
                end=mid-1;
            else
                start=mid+1;
        } else {
            if (target>nums[mid] && target<=nums[end])
                start=mid+1;
            else
                end=mid-1;
        }
    }
    return false; 
}

剑指Offer:查找最小的元素? 每次都往递增区间的反方向二分查找,直到前后下标相邻,后下标所指向的元素即为最小元素 特殊情况:前中后指向的元素都相等,无法进行二分的划分,因此这种情况只能进行线性搜索

#查找