首页 > 代码库 > leetcode - Search in Rotated Sorted Array I & II

leetcode - Search in Rotated Sorted Array I & II

Search in Rotated Sorted Array I

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.

 

Search in Rotated Sorted Array II

Follow up for "Search in Rotated Sorted Array":
What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

Write a function to determine if a given target is in the array.

 

个人思路:

1,这个题只需要考虑从小到大的排序情况,不用考虑从大到小的情况

2,通过几个例子来找出规律,比如数组012345678,经过旋转有如下3种情况:

  1,345678012,mid=7,mid左边是有序的,右边还是一个旋转数组

  2,780123456,mid=2,mid右边是有序的,左边还是一个旋转数组

  3,012345678,mid=4,两边都是有序的情况

现在来找出beign(起始值),mid(中间值),end(末尾值)三者之间的关系

  1,当mid>begin,有可能是1和3这两种情况,那么左边是有序的,可以用target与begin和mid值比较,若在begin和mid范围,则就在该段范围内查找即可,不用再管右边的元素了,若不在begin和mid范围内,则说明target在mid和end之间,将begin设置为mid+1,然后用同样的方式在新的begin和end之间查找即可

  2,当mid<begin,则是2这种情况,那么右边是有序的,则用target与mid和end值比较,若在mid和end范围,则就在该段范围内查找即可,不用再管左边的元素了,若不在mid和end范围内,则说明target在begin和end之间,将end设置为mid-1,然后用同样的方式在新的begin和end之间查找即可

  3,当mid==begin,若仅仅是为了解第1题,则可将该种情况的判断合并到1里即可,但如果是第2题,由于有重复元素,需要单独判断,比如数组13111和11131都是mid==begin,但是一个是3在左边,一个是3在右边,就不能依据mid和begin的比较情况来缩小一半的范围,需要将begin++,一步一步往下看

  4,若mid的值刚好为target,则返回即可

3,这里说下第1题里面两个特殊的测试用例,一个是数组元素只有2个的时候,另外一个是数组元素只有1个的时候,当出现这两种情况的时候,mid等于begin

4,做这题的时候,主要是要找到规律以便使用二分查找,还有就是考虑几个特殊的情况

代码:(将返回值改一下也可以AC第2题)

 1 class Solution { 2 public: 3     int search(int A[], int n, int target) { 4         int begin = 0, end = n - 1; 5         int mid; 6         while (begin <= end) 7         { 8             mid = (begin + end) / 2; 9             if (A[mid] == target)10             {11                 return mid;12             }13             if (A[mid] > A[begin])14             {15                 if (target >= A[begin] && target < A[mid])16                 {17                     end = mid - 1;18                 }19                 else20                 {21                     begin = mid + 1;22                 }23             }24             else if (A[mid] < A[begin])25             {26                 if (target > A[mid] && target <= A[end])27                 {28                     begin = mid + 1;29                 }30                 else31                 {32                     end = mid - 1;33                 }34             }35             else36             {37                 ++begin;38             }39         }40         return -1;41     }42 };
View Code

 

leetcode - Search in Rotated Sorted Array I & II