Search in Rotated Sorted Array

首先利用二分查找的方法找到最小值,然后在以最小值为分界的两块分别进行二分搜索。

 1 int findPos(int A[], int left, int right){
 2     if(left > right)
 3         return -1;
 4     int mid = (left+right)/2;
 5     int result;
 6     if(A[left] > A[mid]){
 7         result = findPos(A, left, mid-1);
 8         if(result == -1)
 9             return mid;
10         else
11             return A[result]<A[mid]?result:mid;
12     }
13     else{
14         result = findPos(A, mid+1, right);
15         if(result == -1)
16             return left;
17         else
18             return A[left]<A[result]?left:result;
19     }
20 }
21 int bsearch(int A[], int left, int right, int target){
22     if(left > right)
23         return -1;
24     int mid = (left+right)/2;
25     if(A[mid] == target)
26         return mid;
27     else if(A[mid] < target)
28         return bsearch(A, mid+1, right, target);
29     else
30         return bsearch(A, left, mid-1, target);
31 }
32     int search(int A[], int n, int target) {
33         int pos = findPos(A, 0, n-1);
34         int result = bsearch(A, 0, pos-1, target);
35         if(result != -1)
36             return result;
37         return bsearch(A, pos, n-1, target);
38     }

 另外一种方法是直接二分,不过增加了一些判断,比上述代码要简练。

 1     int search(int A[], int n, int target) {
 2         if(n == 0)
 3             return -1;
 4         int l = 0, r = n-1, m;
 5         while(l <= r){
 6             m = (l+r)/2;
 7             if(A[m] == target)
 8                 return m;
 9             else if(A[m] > A[l]){
10                 if(target < A[m] && target >= A[l])
11                     r = m-1;
12                 else
13                     l = m+1;
14             }
15             else if(A[m] < A[l]){
16                 if(target > A[m] && target <= A[r])
17                     l = m+1;
18                 else
19                     r = m-1;
20             }
21             else
22                 l++;
23         }
24         return -1;
25     }

 

转载于:https://www.cnblogs.com/waruzhi/p/3348696.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值