您的位置:首页 > 其它

【Leetcode】之Search in Rotated Sorted Array

2015-12-02 10:58 288 查看

一.问题描述

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.

二.我的解题思路

拿到本题,首先需要做的就是理解Rotated Sorted Array的含义。虽然并不知道题目所给例子中的rotate怎么来的,但是按照题意,应该只有单调递增和先递增,然后突然下降再上升这样两种趋势。

明白了rotate之后,接下来就是要求解target的位置。如果数组是一般的单调递增数组,很自然的想到利用二分法。对于rotate的数组,仍然还是用二分法,不过在边界条件的判断上需要特别注意。测试通过的程序如下:

class Solution {
public:
int search(vector<int>& nums, int target) {
int len = nums.size();int flag;int part=0;
int left=0;int right=len-1;
int mid=(left+right)/2;
if(nums[0]>nums[len-1])
flag=0;  //旋转过得
else
flag=1;  //未旋转过得
if(flag==0){
while(nums[mid]!=target)
{
if(target>=nums[0])
part=1;
else
part=0;
if(nums[mid]>target){
if(nums[mid]>nums[0]&&part==1)
right=mid;
if(nums[mid]>nums[0]&&part==0)
left=mid;
if(nums[mid]<nums[0])
right=mid;
}

if(nums[mid]<target){
if(nums[mid]>nums[0])
left=mid;
if(nums[mid]<nums[0]&&part==0)
left=mid;
if(nums[mid]<nums[0]&&part==1)
right=mid;
}

mid=(left+right)/2;
if(right-left==1){
if(nums[left]==target)
return left;
if(nums[right]==target)
return right;
return -1;

}
if(left==right)
break;
}
if(nums[mid]!=target)
return -1;
else
return mid;
}

if(flag==1){
while(nums[mid]!=target)
{

if(nums[mid]>target)
right=mid;
if(nums[mid]<target)
left=mid;
mid=(left+right)/2;

if(right-left==1){
if(nums[left]==target)
return left;
if(nums[right]==target)
return right;
return -1;

}
if(left==right)
break;
}
if(nums[mid]!=target)
return -1;
else
return mid;
}

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: