力扣 题目81- 搜索旋转排序数组 II

无聊的阿库娅·2022-07-04 13:56·10 次阅读

力扣 题目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
复制代码

 

力扣 题目81- 搜索旋转排序数组 II

 

posted @   无聊的阿库娅  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
どんどんドーナツどーんと行こう! - 浜口史郎
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.
  1. 1 どんどんドーナツどーんと行こう! 浜口史郎
  2. 2 パティのテーマ 神前暁
  3. 3 今はその剣を置いて 川井憲次
点击右上角即可分享
微信分享提示