diff --git a/solutions/81. Search in Rotated Sorted Array II.md b/solutions/81. Search in Rotated Sorted Array II.md new file mode 100644 index 0000000..845b294 --- /dev/null +++ b/solutions/81. Search in Rotated Sorted Array II.md @@ -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& 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; + } +}; +```