力扣hot100:33. 搜索旋转排序数组(二分的理解)

 33.搜索旋转排序数组

d5b31574aa144e6fa1314d4c8c5fbc9e.png

这是一个非常有趣的问题,如果不要求使用O(logn)应该没人会想到吧。。

方法一:

        极致的分类讨论。旋转排序数组,无非就是右边的增区间的数小于左边的增区间的数,然后依次排序。因此我们只需要分三类讨论即可,即[left,right]在左增区间,[left,right]在右增区间,[left,right]在两个区间中间。只有最后一种情况需要讨论更多一点。

        前两种情况可以合并为nums[left]<=nums[right]时的情况,这样一定是有序数组。

        最后一种情况又分为,target在左增区间中,target在右增区间中、nums[mid]在左增区间中、nums[mid]在右增区间中:一共4种情况。

如果target在左增区间中,则有target>nums[right],

如果target在右增区间中,则target<=nums[right],

如果nums[mid]在左增区间中,则有nums[mid]>nums[rgiht],

如果nums[mid]在右增区间中,则有nums[mid]<=nums[rgiht],

如果使得right=mid-1;则有target在mid左边,则有两种情况:

①mid在右增区间中,target小于mid的值  或者  target大于mid的值且大于nums[right]的值,即target在左增区间中。

②mid在左增区间中,target小于mid的值 且target也在左增区间中

class Solution {
public:int search(vector<int>& nums, int target) {int left=0,right=nums.size()-1;while(left<=right){int mid=(left+right)>>1;if(nums[mid]==target) return mid;if(nums[left]>=nums[0]&&nums[right]>=nums[0]){if(nums[mid]>target) {right=mid-1;continue;}}else{if(nums[left]<nums[0]&&nums[right]<nums[0]){if(nums[mid]>target) {right=mid-1;continue;}}else{if(nums[left]>=nums[0]&&nums[right]<nums[0]){if(nums[mid]>nums[right]&&target<nums[mid]&&target>nums[right]){right=mid-1;continue;}if(nums[mid]<=nums[right]&&(target>nums[right]||target<nums[mid])) {right=mid-1;continue;}}}}left=mid+1;}return -1;}
};
/*
或者讨论target在哪个区间
if(target>nums[right]&&(target<nums[mid]||nums[mid]<nums[right])){right=mid-1;continue;}
if(target<nums[right]&&target<nums[mid]&&nums[mid]<=nums[right]) {right=mid-1;continue;}
*/

合并情况:

class Solution {
public:int search(vector<int>& nums, int target) {int left=0,right=nums.size()-1;while(left<=right){int mid=(left+right)>>1;if(nums[mid]==target) return mid;if(nums[left]<=nums[right]){if(nums[mid]>target) {right=mid-1;continue;}}else{if(nums[mid]>nums[right]&&target<nums[mid]&&target>nums[right]) {right=mid-1;continue;}if(nums[mid]<=nums[right]&&(target>nums[right]||target<nums[mid])) {right=mid-1;continue;}}left=mid+1;}return -1;}
};

方法二 :官方思路:

        一个区间分为左增区间和右增区间,那么在任意一个点将这个区间断开分为两个区间一定会有一个区间是顺序区间!我们保证每次只在那个顺序区间里找(doge),如果不在这个顺序区间里我们就直接将指针移入那个区间即可,这保证了每一次也是二分的。

class Solution {
public:int search(vector<int>& nums, int target) {int n = (int)nums.size();if (!n) {return -1;}if (n == 1) {return nums[0] == target ? 0 : -1;}int l = 0, r = n - 1;while (l <= r) {int mid = (l + r) / 2;if (nums[mid] == target) return mid;if (nums[l] <= nums[mid]) {//左区间是顺序区间if (nums[l] <= target && target < nums[mid]) {//target在左区间内则r=mid-1r = mid - 1;} else {l = mid + 1;}} else {//右区间是顺序区间if (nums[mid] < target && target <= nums[n - 1]) {//target在右区间内则l=mid+1l = mid + 1;} else {r = mid - 1;}}}return -1;}
};

总结来看,二分就是“均分”区间之后,判断left移入右边  还是 right移入左边,如果可以满足这一性质就是一个二分,O(logn)的算法。 

不管是第一种方法,还是第二种方法都是判断如何移动,只是判断方式不同,第二种方法更直接。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/752396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CMAKE_CUDA_ARCHITECTURES set to ‘native’多版本与版本号矛盾问题,报错

CMAKE_CUDA_ARCHITECTURES set to ‘native’多版本与版本号矛盾问题&#xff0c;报错 1. 报错提醒如下图2. 原因本地安装多个cuda版本导致native寻找到多个版本&#xff0c;导致报错3. 具体配置需要根据你的显卡型号来确认 1. 报错提醒如下图 2. 原因本地安装多个cuda版本导致…

【prometheus】k8s集群部署prometheus server(文末送书)

目录 一、概述 1.1 prometheus简介 1.2 prometheus架构图 1.3测试环境 二、k8s集群中部署prometheus server 2.1创建sa账号和数据目录 2.2安装prometheus 2.2.1创建configmap存储卷存放prometheus配置信息 2.2.2 通过deployment部署prometheus 2.2.3prometheus pod创…

ConsiStory:Training-Free的主体一致性生成

Overview 一、总览二、PPT详解 ConsiStory 一、总览 题目&#xff1a; Training-Free Consistent Text-to-Image Generation 机构&#xff1a;NVIDIA, Tel-Aviv University 论文&#xff1a;https://arxiv.org/pdf/2402.03286.pdf 代码&#xff1a;https://consistory-paper.g…

zookeeper快速入门三:zookeeper的基本操作

在zookeeper的bin目录下&#xff0c;输入./zkServer.sh start和./zkCli.sh启动服务端和客户端&#xff0c;然后我们就可以进行zookeeper的基本操作了。如果是windows&#xff0c;请参考前面章节zookeeper快速入门一&#xff1a;zookeeper安装与启动 目录 一、节点的增删改查 …

【Java基础知识总结 | 第三篇】深入理解分析ArrayList源码

文章目录 3.深入理解分析ArrayList源码3.1ArrayList简介3.2ArrayLisy和Vector的区别&#xff1f;3.3ArrayList核心源码解读3.3.1ArrayList存储机制&#xff08;1&#xff09;构造函数&#xff08;2&#xff09;add()方法&#xff08;3&#xff09;新增元素大体流程 3.3.2ArrayL…

react03

react03 修改脚手架创建的打包命令 根据scripts中的命令&#xff0c;执行npm run eject ,输入y, 如果对原始的脚手架文件有过改动需要进行将修改后的文件提交到git 历史区 &#xff0c;防止暴露后的代码覆盖我们自己的文件 git 提交&#xff1a; git add . git commit -m ‘…

java----网络编程(一)

一.什么是网络编程 用户在浏览器中&#xff0c;打开在线视频网站&#xff0c;如优酷看视频&#xff0c;实质是通过网络&#xff0c;获取到网络上的一个视频资源。 与本地打开视频文件类似&#xff0c;只是视频文件这个资源的来源是网络。所谓网络资源就是网络中获取数据。而所…

LabVIEW提升舱救援通讯监测系统

LabVIEW提升舱救援通讯监测系统 随着科技的进步&#xff0c;煤矿救援工作面临着许多新的挑战。为了提高救援效率和安全性&#xff0c;设计并实现了一套基于LabVIEW的提升舱救援通讯监测系统。该系统能够实时监控提升舱内的环境参数和视频图像&#xff0c;确保救援人员和被困人…

el-input设置max、min无效的解决方案

目录 一、方式1&#xff1a;type“number” 二、方式2&#xff1a;oninput&#xff08;推荐&#xff09; 三、计算属性 如下表所示&#xff0c;下面为官方关于max&#xff0c;min的介绍&#xff1a; el-input&#xff1a; max原生属性&#xff0c;设置最大值min原生属性&a…

06.共享内存

1.内存映射&#xff08;mmap&#xff09; 我们在单片机中首先接触到了映射的概念 将一个寄存器的地址映射到了另外的一个存储空间中 内存映射: 内存映射&#xff08;Memory Mapping&#xff09;是一种在计算机科学中使用的技术&#xff0c;它允许将文件或其他设备的内容映射…

idea warning:java源值已过时将在未来所有发行版中删除

在idea中运行maven项目 如果出现idea warning:java源值已过时将在未来所有发行版中删除&#xff0c;详见如下截图所示&#xff1a; 注意&#xff1a;jdk8 要解决这个警告需要设置3个地方 首先打开File->Project Structure中的Project&#xff0c;将SDK和language level都设…

五、保持长期高效的七个法则(二)Rules for Staying Productive Long-Term(1)

For instance - lets say youre a writer.You have a bunch of tasks on your plate for the day, but all of a sudden you get a really good idea for an essay. You should probably start writing now or youll lose your train of thought.What should you do? 举例来说…

分布式搜索引擎(3)

1.数据聚合 **[聚合&#xff08;](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html)[aggregations](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html)[&#xff09;](https://www.ela…

机器学习(26)回顾gan+文献阅读

文章目录 摘要Abstract一、李宏毅机器学习——GAN1. Introduce1.1 Network as Generator1.2 Why distribution 2. Generative Adversarial Network2.1 Unconditional generation2.2 Basic idea of GAN 二、文献阅读1. 题目2. abstract3. 网络架构3.1 Theoretical Results 4. 文…

Oracle P6 Professional 配置连接数据库总结

前言 P6 Professional作为Oracle P6计划管理系统的重要套件之一&#xff0c;其操作出色&#xff0c;体检佳&#xff0c;是非常多的计划工程师跟踪项目进度计划的辅助工具。自20年前&#xff0c;Professional一直在不断的演变更新&#xff0c;以适应当前的新技术&#xff0c;从…

【MySQL】MySQL事务

文章目录 一、CURD不加控制&#xff0c;会有什么问题&#xff1f;二、事务的概念三、事务出现的原因四、事务的版本支持五、事务提交方式六、事务常见操作方式七、事务隔离级别1.理解隔离性12.隔离级别3.查看与设置隔离性4.读未提交【Read Uncommitted】5.读提交【Read Committ…

【Numpy】练习题100道(76-100题完结)

&#x1f33b;个人主页&#xff1a;相洋同学 &#x1f947;学习在于行动、总结和坚持&#xff0c;共勉&#xff01; #学习笔记# Git-hub链接 题目列表&#xff08;题解往下翻&#xff09; 76.考虑一个一维数组Z&#xff0c;构建一个二维数组&#xff0c;其第一行为(Z[0],Z[…

【鸿蒙HarmonyOS开发笔记】组件编程技巧之使用@Builder装饰器实现UI结构复用

概述 当页面有多个相同的UI结构时&#xff0c;若每个都单独声明&#xff0c;同样会有大量重复的代码。为避免重复代码&#xff0c;可以将相同的UI结构提炼为一个自定义组件&#xff0c;完成UI结构的复用。 除此之外&#xff0c;ArkTS还提供了一种更轻量的UI结构复用机制Build…

小白DB补全计划Day1-LeetCode:SQL基本操作select

前言&#xff1a;找工作&#xff08;主人&#xff09;的任务罢了 链接&#xff1a;1757. 可回收且低脂的产品 - 力扣&#xff08;LeetCode&#xff09; 584. 寻找用户推荐人 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 对DB篇的SQL章不太知道怎么写…

数学建模-估计出租车的总数

文章目录 1、随机抽取的号码在总体的排序 1、随机抽取的号码在总体的排序 10个号码从小到大重新排列 [ x 0 , x ] [x_0, x] [x0​,x] 区间内全部整数值 ~ 总体 x 1 , x 2 , … , x 10 总体的一个样本 x_1, x_2, … , x_{10} ~ 总体的一个样本 x1​,x2​,…,x10​ 总体的一个样…