Boostable

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

LeetCode: 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.

地址:https://oj.leetcode.com/problems/search-in-rotated-sorted-array/

算法:将二分查找稍微改进一下就可以了。首先,我们把旋转后的数组分为上部分和下部分,比如题目例子中(4 5 6 7)为上部分,(0 1 2)为下部分,注意上部分和下部分都有可能为空。如果中间节点等于目标值,返回;否则,若中间节点大于尾节点,说明中间节点处于上部分,此时在分三种情况讨论,具体可以看代码;若中间节点小于等于尾节点,说明中间节点处于下部分,此时也可以分三种情况,具体看代码。代码:

 1 class Solution {
 2 public:
 3     int search(int A[], int n, int target) {
 4         if(n < 1)   return -1;
 5         int begin = 0, end = n-1;
 6         int mid = 0;
 7         while(begin <= end){
 8             mid = (begin + end) >> 1;
 9             if(A[mid] == target){
10                 return mid;
11             }
12             if(A[mid] > A[end]){
13                 if(A[mid] < target)
14                     begin = mid + 1;
15                 else if(target > A[end]){
16                     end = mid - 1;
17                 }else{
18                     begin = mid + 1;
19                 }
20             }else{
21                 if(A[mid] > target){
22                     end = mid - 1;
23                 }else if(target <= A[end]){
24                     begin = mid + 1;
25                 }else{
26                     end = mid - 1;
27                 }
28             }
29         }
30         return -1;
31     }
32 };

第二题:

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.

地址:https://oj.leetcode.com/problems/search-in-rotated-sorted-array-ii/

算法:跟上一题比,多了一个条件:数组中的元素有可能不唯一。同样把bottom和top之间分为上部分和下部分。首先,如果mid就是要找的元素,直接返回;否则,如果top的元素大于bottom的元素,说明bottom和top之间的元素是有序的,则按正常的二分查找即可。否则如果mid大于bottom,则mid位于上部分,所以分三种情况讨论;如果mid小于bottom,则mid为于下部分,所以也分三种情况讨论;剩下mid等于bottom的情况,如果此时mid大于top的话,那说明bottom和mid之间的所有元素都相等,所以都不等与target,故bottom之间设为mid+1;剩下的情况直接线性查找。代码:

 1 class Solution {
 2 public:
 3     bool search(int A[], int n, int target) {
 4         if(!A || n < 1){
 5             return false;
 6         }
 7         int bottom = 0;
 8         int top = n - 1;
 9         while(bottom <= top){
10             int mid = (bottom + top) / 2;
11             if(A[mid] == target){
12                 return true;
13             }
14             if(A[top] > A[bottom]){
15                 if(A[mid] < target)
16                     bottom = mid + 1;
17                 else
18                     top = mid - 1;
19             }else{
20                 if(A[mid] > A[bottom]){ 
21                     if(A[mid] < target)
22                         bottom = mid + 1;
23                     else if(A[bottom] <= target)
24                         top = mid - 1;
25                     else
26                         bottom = mid + 1;
27                 }else if(A[mid] < A[bottom]){
28                     if(A[mid] > target)
29                         top = mid - 1;
30                     else if(A[top] >= target)
31                         bottom = mid + 1;
32                     else
33                         top = mid - 1;
34                 }else{
35                     if(A[top] < A[mid]){
36                         bottom = mid + 1;
37                     }else{
38                         for(int i = bottom; i <= top; ++i){
39                             if(A[i] == target){
40                                 return true;
41                             }
42                         }
43                         return false;
44                     }
45                 }
46             }
47         }
48         return false;
49     }
50 };

 

posted on 2014-09-03 22:22  Boostable  阅读(189)  评论(0编辑  收藏  举报