您的位置:首页 > 编程语言 > C语言/C++

Search in Rotated Sorted Array

2016-07-16 11:13 513 查看
题目描述:

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.
解题思路:
首先通过二分查找找到前后两个子有序数组分隔处的索引,例如对于[4,5,6,7,0,1,2],首先找到

元素7的索引,然后根据target和数组首元素的大小关系确定target位于哪一个子数组上,

最后在该子数组上进行二分查找即可

AC代码如下:

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