力扣 题目81- 搜索旋转排序数组 II
题目
题解
本体既然是 力扣 题目33-- 搜索旋转排序数组 的变种 那么我们的代码也由33题的代码改改吧
这题与33题不一样的地方在于有重复的出现 那么在33题中我们根据nums[left] > nums[right] 去分割的条件需要改善 到nums[left] >= nums[right]
结果死循环了 观察发现 原来到最后left=right时nums[left] >= nums[right] 一样满足导致死循环 于是改善条件为
nums[left] > nums[right]||(nums[left] == nums[right]&& left!= right) 即可
代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 //二分搜索 5 int ersearch(vector<int>& nums,int target,int left,int right) 6 { 7 while (left <= right) { 8 int middle = left + ((right - left) / 2); 9 if (nums[middle] > target) { 10 right = middle - 1; 11 } 12 else if (nums[middle] < target) { 13 left = middle + 1; 14 } 15 else { 16 return middle; 17 } 18 } 19 return -1; 20 } 21 //分割 22 int division(vector<int>& nums,int left, int right,int target) 23 { 24 //找到中心位置 25 int middle = left+((right - left) / 2); 26 int num = -1; 27 //如果第一个比最后一个大 或者第一个与最后一个相等并且位置不一样 那么无序 需要分割 28 if (nums[left] > nums[right]||(nums[left] == nums[right]&& left!= right)) { 29 //递归方法 以中心点进行分割 左 30 num=division(nums,left, middle, target); 31 //返回的如果不是-1 那么就是在之后的调用中找到了位置 需要返回 32 if (num != -1) { 33 return num; 34 } 35 //递归方法 以中心点进行分割 右 36 num=division(nums,middle+1,right, target); 37 //返回的如果不是-1 那么就是在之后的调用中找到了位置 需要返回 38 if (num != -1) { 39 return num; 40 } 41 } 42 //如果第一个比最后一个小 那么有序 范围判断后进行二分搜索 43 else 44 { 45 //判断target是否在这个范围内 46 if (target <= nums[right] && target >= nums[left]) { 47 return ersearch(nums, target, left, right); 48 } 49 else 50 { 51 return -1; 52 } 53 } 54 return -1; 55 } 56 class Solution { 57 public: 58 bool search(vector<int>& nums, int target) { 59 //调用分割函数 60 int position=division(nums,0, nums.size()-1, target); 61 return position!=-1; 62 } 63 }; 64 int main() { 65 vector<int>nums = { 2,5,6,0,0,1,2 }; 66 int target = 2; 67 Solution sol; 68 bool result=sol.search(nums, target); 69 cout << result << endl; 70 }