33. Search in Rotated Sorted Array

来源:互联网 发布:java命令行导入jar包 编辑:程序博客网 时间:2024/04/28 08:54

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

这道题让在旋转数组中搜索一个给定值,若存在返回坐标,若不存在返回-1。我们还是考虑二分搜索法,但是这道题的难点在于我们不知道原数组在哪旋转。

这里写图片描述

方法一:

int SearchInRotatedSortedArray::search1(vector<int>& nums, int target){    return searchFrom(nums, target, 0, nums.size() - 1);}int SearchInRotatedSortedArray::searchFrom(vector<int>& nums, int target, int begin, int end){    if (begin > end) return -1;    int indexMid = (begin + end) / 2;    int valueMid = nums[indexMid];    if (valueMid == target)    {        return indexMid;    }    else if (valueMid > target)    {        if (target > nums[end])        {            return searchFrom(nums, target, begin, indexMid - 1);        }        else        {            int value = searchFrom(nums, target, begin, indexMid - 1);            return value == -1 ? searchFrom(nums, target, indexMid + 1, end) : value;        }    }    else if (valueMid < target)    {        if (target < nums[begin])        {            return searchFrom(nums, target, indexMid + 1, end);        }        else        {            int value = searchFrom(nums, target, begin, indexMid - 1);            return value == -1 ? searchFrom(nums, target, indexMid + 1, end) : -1;        }    }}

方法二:

int SearchInRotatedSortedArray::search2(vector<int>& A, int target) {    int l = 0;    int r = A.size() - 1;    while (l <= r) {        int mid = (l + r) / 2;        if (target == A[mid]) return mid;        if (A[l] <= A[r]) {            if (target < A[mid]) r = mid - 1;            else l = mid + 1;        }        else if (A[l] <= A[mid]) {            if (target > A[mid] || target < A[l]) l = mid + 1;            else r = mid - 1;        }        else {            if (target < A[mid] || target > A[r]) r = mid - 1;            else l = mid + 1;        }    }    return -1;}
原创粉丝点击