您的位置:首页 > 其它

LeetCode-33.Search in Rotated Sorted Array

2016-07-18 22:38 381 查看
https://leetcode.com/problems/search-in-rotated-sorted-array/

Suppose a sorted array 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.
方法一
转化为题LeetCode-153.Find Minimum in Rotated Sorted Array

找到数组中的min,然后分别在左右子数组中用二分查找

class Solution {
public:
int helper(vector<int>& nums, int l, int r,int target)
{
int mid;
while (l <= r)
{
mid = l + (r - l) / 2;
if (target == nums[mid])
return mid;
if (target > nums[mid])
l = mid + 1;
else
r = mid - 1;
}
return -1;
}

int search(vector<int>& nums, int target)
{
int n = nums.size();
if (n == 0)
return -1;
if (nums[0] <= nums[n - 1])
return helper(nums, 0, n - 1,target);
int l = 0, r = n - 1, mid;
while (l < r)
{
mid = l + (r - l) / 2;
if (target == nums[mid])
return mid;
if (nums[l] < nums[r])
break;
if (nums[l] <= nums[mid])
l = mid + 1;
else
r = mid;
}
int res= helper(nums, 0, l-1, target);
if (res != -1)
return res;
return helper(nums, l, n-1, target);
}
};


方法二

只使用一次二分

1、如果target == nums[mid],直接返回mid

2、如果nums[l] <= nums[mid],则说明l到mid一定是有序的,判断target是否在l到mid之间

3、如果nums[l] > nums[mid],则说明mid到r一定是有序的,判断target是否在mid到r之间

int search(vector<int>& nums, int target)
{
int n = nums.size();
if (n == 0)
return -1;
int l = 0, r = n - 1, mid;
while (l <= r)
{
mid = l + (r - l) / 2;
if (target == nums[mid])
return mid;
if (nums[l] <= nums[mid])
{
if (target < nums[mid]&&target>=nums[l])
r = mid - 1;
else
l = mid + 1;
}
else
{
if (target > nums[mid]&&target<nums[l])
l = mid + 1;
else
r = mid - 1;
}
}
return -1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode 二分法