mirror of
https://github.com/ShusenTang/LeetCode.git
synced 2024-09-02 14:20:01 +00:00
Create 81. Search in Rotated Sorted Array II.md
This commit is contained in:
parent
a62cc29993
commit
e9c8b96dc1
38
solutions/81. Search in Rotated Sorted Array II.md
Normal file
38
solutions/81. Search in Rotated Sorted Array II.md
Normal file
@ -0,0 +1,38 @@
|
||||
# [81. Search in Rotated Sorted Array II](https://leetcode.com/problems/search-in-rotated-sorted-array-ii/)
|
||||
# 思路
|
||||
在一个经过了循环移位的有序数组(可能有重复元素)里进行查找,在有序数组里进行查找,肯定二分。
|
||||
这题和[33. Search in Rotated Sorted Array](https://leetcode.com/problems/search-in-rotated-sorted-array/)其实是类似的,唯一不同就是此题可能有重复元素。
|
||||
但是基本思路不变,参考[33题题解思路二](https://github.com/ShusenTang/LeetCode/blob/master/solutions/33.%20Search%20in%20Rotated%20Sorted%20Array.md),
|
||||
我们得到一个重要的想法:**二分后左右两半至少有一半是有序的**。所以我们可以判断target是否在这有序的一半,若在则丢弃掉另一半进入下一次循环,若不在则丢弃掉有序的这一半进入下一次循环。
|
||||
那么如何判断哪一半是有序的呢?分为以下几种情况:
|
||||
1. 若`nums[mid] == target`,则返回true即可。
|
||||
2. 若`nums[low] < nums[mid]`,则左半边一定有序;
|
||||
3. 若`nums[low] > nums[mid]`,则右半边一定有序;
|
||||
4. 否则,我们无法判断到底哪一边有序,但是可以肯定的是`nums[low] != target`,所以此时我们直接`low++`然后进入下一循环。
|
||||
|
||||
最坏的情况就是数组中元素全相等且不等于target,此时时间复杂度为O(n)
|
||||
空间复杂度O(1)
|
||||
|
||||
# C++
|
||||
``` C++
|
||||
class Solution {
|
||||
public:
|
||||
bool search(vector<int>& nums, int target) {
|
||||
int mid, low = 0, high = nums.size() - 1;
|
||||
while(low <= high){
|
||||
mid = (high - low) / 2 + low;
|
||||
if(nums[mid] == target) return true;
|
||||
if(nums[low] < nums[mid]){
|
||||
if(nums[low] <= target && target <= nums[mid]) high = mid - 1;
|
||||
else low = mid + 1;
|
||||
}
|
||||
else if(nums[low] > nums[mid]) {
|
||||
if(nums[mid] <= target && target <= nums[high]) low = mid + 1;
|
||||
else high = mid - 1;
|
||||
}
|
||||
else low++;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
```
|
Loading…
Reference in New Issue
Block a user