力扣 题目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) 即可

代码

 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 }
View Code

 

 

 

posted @ 2022-07-04 13:56  无聊的阿库娅  阅读(10)  评论(0编辑  收藏  举报