5-002-(LeetCode- 33) 搜索旋转排序数组
Posted arctic_fox
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5-002-(LeetCode- 33) 搜索旋转排序数组相关的知识,希望对你有一定的参考价值。
1. 题目
2. 解法
3. 总结
leetcode[33. 搜索旋转排序数组]
leetcode33. 搜索旋转排序数组
刚开始我的思路是先遍历直到发现断层,如果有与target一样的值就直接返回,否则就对断层的地方一直到最后进行二分查找。
class Solution {
public:
int search(vector<int>& nums, int target) {
int ans = -1,pos = 0,n = nums.size();
for(int i = 0; i < n; i++){
if(nums[i] == target) return i;
if(i != n - 1 && nums[i] > nums[i+1]) {pos = i+1; break;}
}
n = n-1;
while(pos <= n){
int mid = (pos+n)/2;
if(nums[mid] == target) {ans = mid; break;}
if(nums[mid] < target) pos = mid+1;
if(nums[mid] > target) n = mid-1;
}
return ans;
}
};
但这样的最坏复杂度还是O(n)的,看了答案才知道像这样有只有一个断层的序列也能直接用二分.
class Solution {
public:
int search(vector<int>& nums, int target) {
int i = 0,j = nums.size()-1,ans = -1;
if(j+1 == 0) return -1;
while(i <= j){
int mid = (i+j)/2;
if(target == nums[mid]) return mid;
if(nums[mid] >= nums[0]){
if(target < nums[mid] && target >= nums[0]) j = mid-1;
else i = mid+1;
}
else{
if(target >= nums[0] || target < nums[mid]) j = mid-1;
else i = mid+1;
}
}
return ans;
}
};
而且题解中有一个代码量非常少的答案,思路和二分一样,只不过运用一些数学的判断让代码变得很简洁
总结:排好序的数组可以用二分查找,只有一个排序断层的数组也能直接用二分进行查找!
以上是关于5-002-(LeetCode- 33) 搜索旋转排序数组的主要内容,如果未能解决你的问题,请参考以下文章