LeetCode --- 33. Search in Rotated Sorted Array
来源:互联网 发布:沈阳传媒网络微信缴费 编辑:程序博客网 时间:2024/05/02 00:27
题目链接: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.
这道题的要求是在一个经过旋转的有序数组中,找到给定的target,返回其索引。如果不存在,返回-1。可以假设数组中没有重复元素。
直接思路,遍历数组,是将复杂度O(n)。但由于数组有序,可以考虑二分查找,不过由于数组经过旋转,而且不知道在何处为旋转点,因此会比普通的二分查找多了一些判断条件:
- 当target大于A[m]时,如果target存在,则应该在m的右侧或者因为旋转而转到m的左侧。先考虑因为旋转而转到m的左侧的情形,这需要满足两个条件:m右侧没有旋转(即A[m]小于A[r])和target大于A[r],这时便可以确定target在m的左侧了,可令r等于m-1。而其他情况,target就在m的右侧。
- 当target小于A[m]时,如果target存在,则应该在m的左侧或者因为旋转而转到m的右侧。先考虑因为旋转而转到m的右侧的情形,这需要满足两个条件:m左侧没有旋转(即A[m]大于A[r])和target小于A[l],这时便可以确定target在m的右侧了,可令l等于m+1。而其他情况,target就在m的右侧。
时间复杂度:O(logn)
空间复杂度:O(1)
1 class Solution 2 { 3 public: 4 int search(int A[], int n, int target) 5 { 6 int l = 0, r = n - 1; 7 while(l <= r) 8 { 9 int m = (l + r) / 2;10 if(A[m] == target)11 return m;12 else if(target > A[m])13 {14 if(A[m] < A[r] && target > A[r])15 r = m - 1;16 else17 l = m + 1;18 }19 else20 {21 if(A[m] > A[r] && target < A[l])22 l = m + 1;23 else24 r = m - 1;25 }26 }27 return -1;28 }29 };
另一种思路:先通过比较A[l]和A[m]的大小判断左侧是否旋转。
- 如果A[l] <= A[m],则说明左侧没有发生旋转,即左侧是递增的,因此如果target在A[l]和A[m]之间,则令r等于m-1,否则说明target在右侧,则令l等于m+1;
- 如果A[l] > A[m],则说明右侧没有发生旋转,即右侧是递增的,因此如果target在A[m]和A[r]之间,则令l等于m+1,否则说明target在左侧,则令r等于m-1;
1 class Solution 2 { 3 public: 4 int search(int A[], int n, int target) 5 { 6 int l = 0, r = n - 1; 7 while(l <= r) 8 { 9 int m = (l + r) / 2;10 if(A[m] == target)11 return m;12 if(A[l] <= A[m])13 {14 if(A[l] <= target && target < A[m])15 r = m - 1;16 else17 l = m + 1;18 }19 else20 {21 if(A[m] < target && target <= A[r])22 l = m + 1;23 else24 r = m - 1;25 }26 }27 28 return -1;29 }30 };
转载请说明出处:LeetCode --- 33. Search in Rotated Sorted Array
0 0
- [LeetCode]33.Search in Rotated Sorted Array
- LeetCode --- 33. Search in Rotated Sorted Array
- LeetCode 33.Search in Rotated Sorted Array
- [Leetcode] 33. Search in Rotated Sorted Array
- Leetcode-33.Search in Rotated Sorted Array.
- [leetcode] 33. Search in Rotated Sorted Array
- Leetcode 33. Search in Rotated Sorted Array
- [LeetCode]33. Search in Rotated Sorted Array
- leetcode 33. Search in Rotated Sorted Array
- LeetCode *** 33. Search in Rotated Sorted Array
- LeetCode - 33. Search in Rotated Sorted Array
- LeetCode 33. Search in Rotated Sorted Array
- leetcode 33. Search in Rotated Sorted Array
- leetcode 33.Search in Rotated Sorted Array
- [leetcode]33. Search in Rotated Sorted Array
- leetcode 33. Search in Rotated Sorted Array
- leetcode 33. Search in Rotated Sorted Array
- LeetCode-33.Search in Rotated Sorted Array
- LeetCode --- 31. Next Permutation
- 创业的过程中,你搞清楚这些致命问题了吗?
- linux命令详解--tcpdump
- 黑马程序员—字符串
- LeetCode --- 32. Longest Valid Parentheses
- LeetCode --- 33. Search in Rotated Sorted Array
- HDU 1005
- 子类创建的类似工厂模式
- Servlet——HTTP
- LeetCode --- 34. Search for a Range
- LeetCode --- 35. Search Insert Position
- SSH框架下访问控制设计方案
- LeetCode[Sort]: Maximum Gap
- distance函数的用法