题目详述:
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.
以前总喜欢在IDE里做这种题目,然后自己创建例子测试,现在看来的确是很可笑的行为,现在开始在IDE上面答题了,这道题是第一道,希望可以陆陆续续的全部解决掉,本科不是学的计算机,现在想要准备一下计算机方向的工作,深知基础匮乏,但好在亡羊补牢 为时未晚。
记录一下自己的解题思路。
这道题要从一个看似有序的数组里面找出要找的数字,如果用传统的二分法来做不是不可,只是在处理边界时会出现问题,毕竟此题不是真的sorted array,我的思路是 避重就轻,只处理有序的部分,这基于这样一个观察结果,A[first]到A[mid]到A[last]这两个区间里面必定有一个是有序的,另一个是无序的,先判断前后两部分哪一块是有序的,然后处理有序的这一块,如果要找的target在有序的里面那我就很容易的进行边界处理,如果不在里面那肯定就在无序的那一块了,这样我还是可以将数组的规模进一步缩小。然后在新的数组上再在有序的那一块进行这样的处理,直到最后找到target。
我遇到的问题有两个,一个是:time limit exceeded 原因是我忘记了return -1,另一个是我没有处理好数组只有两个元素时的情况, while(first<=last)以及if(A[first]<=A[mid])里面的等号我忘了,这样就不允许first和mid指向相同的元素了(两个元素的有序部分只有一个元素),前面进不去,后面就进去了,last减一,最后不满足while循环条件退出了。
class Solution {
public:
int search(int A[], int n, int target) {
int first=0,last=n-1,mid=0;
while(first<=last){
mid=(first+last)/2;
if(A[mid]==target) return mid;
if(A[first]<=A[mid])
{ if(A[first]<=target&&A[mid]>target) last=mid-1;
else first=mid+1;}
else{if(A[mid]<target&&A[last]>=target) first=mid+1;
else last=mid-1; }
} return -1;
}};