Leetcode581. 最短无序连续子数组(HOT100)

链接

我的代码:

class Solution {
public:int findUnsortedSubarray(vector<int>& nums) {vector<int> res = nums;sort(res.begin(),res.end());int l = 0,r = nums.size()-1;while(nums[l]==res[l]){++l;if(l==nums.size()){return 0;}}while(nums[r]==res[r]){--r;//这就就不用判断if(r==0)了,因为代码能走到这里说明我们从左到右遍历时遇到了不同的点}return r-l+1;}
};
//https://leetcode.cn/problems/shortest-unsorted-continuous-subarray/solutions/2846020/san-chong-jie-fa-duo-yu-yan-you-pei-tu-b-38a4

更好的代码

class Solution {
public:int findUnsortedSubarray(vector<int>& nums) {int n = nums.size();int l = 0, r=  n-1;while(l+1<n&&nums[l+1]>=nums[l])++l;if(l==n-1)return 0;while(r-1>=0&&nums[r-1]<=nums[r])--r;for(int i = l+1;i<n;i++){while(l>=0&&nums[l]>nums[i])--l;}for(int i = r-1;i>=0;i--){while(r<n&&nums[r]<nums[i])++r;}return r-l-1;}
};

题解:第一种方法很好理解,我们的目标是让整个数组非递减排序。那么我们就拷贝一下原数组,排个序让我们直观地看到最终结果。

然后挨着比较对应位置元素是否相等,不相等说明:这个元素在变成最终结果时需要移动,于是我们用l 记录下来,当然了,每次l++后判断是否到头了。

从右往左也是类似,如果不相等,说明对应元素最终也是需要挪动的。


第二种方法较难:

 我们从左到右找到非递减的右端点l,以及对应的r。

此时l~r之间的元素都是需要排序的,但是仅仅只是它们之间的元素吗?不是!l~r之间的元素可能有整个数组的最小值,那么按照惯例,它在排序后的数组中是要处于0号位置的。所以我们从l+1往右开始轮询,找到l左侧的子数组中,小于等于右侧子数组的最小值的最大值。从那个位置起(不包括它),可以把右侧最小元素搁置下。

同理,l~r之间存在整个数组最大值,这是要往右安置的,所有r指针需要往右移动,移动到某个位置------这个位置要能容纳地下这个比较大的元素。

和l r指针比较时,我们是仅仅需要找出l~r之间的最值元素呢?还是整个数组的?当然是整个数组的:

不难发现,l左侧这些元素可能大于r刚刚遍历走过的元素,如果要将整个数组排序,那么l左侧这些元素应该都要挪动。

所以:遍历时,应该让l--;然后新的指针从l+1开始,一直走到数组最右侧;

同理,r++;然后新的指针从r-1开始,一直走到0位置。 

最终返回值也值得一说:

我们最后两个for循环中的while循环:都是先--或者++之后再判断的,所以它们从while循环出来时,l r指向的都是与左侧或者右侧最值相等的值,相等的值不需要加入到答案中,比如13543,这五个元素,你要把3543重新排序结果是正确的,但是题目中要求最短,所以543才是最终答案。

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

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

相关文章

SQL优化与性能——数据库事务管理

数据库事务管理是数据库系统中至关重要的一部分&#xff0c;确保了数据的一致性、完整性、可靠性和隔离性。尤其在高并发、高负载的系统中&#xff0c;事务管理的设计和实现直接影响到系统的稳定性和性能。本章将详细探讨以下内容&#xff1a;事务的ACID特性、使用 BEGIN、COMM…

CentOS修改yum.repos.d源,避免“Could not resolve host: mirrorlist.centos.org”错误

1、问题现象 由于CentOS停止维护&#xff0c;mirrorlist.centos.org网站也关闭不可访问。导致CentOS默认配置的yum.repos.d源也不可用&#xff0c;所以执行yum命令会报“Could not resolve host: mirrorlist.centos.org”错误。具体如下&#xff1a; Could not retrieve mirror…

【Robocasa】Code Review

文章目录 OverviewalgoInitializationImportant Class MethodsTrain LoopTest Time ConfigsdemoConfig FactoryConfig StructureConfig Locking默认锁定状态配置修改的上下文管理器 dataset示例数据集对象参数说明 model基础模块EncoderCoreVisualCoreScanCore随机化器 (Random…

【单细胞数据库】癌症单细胞数据库CancerSEA

数据库地址&#xff1a;home (hrbmu.edu.cn) Cite Huating Yuan, Min Yan, Guanxiong Zhang, Wei Liu, Chunyu Deng, Gaoming Liao, Liwen Xu, Tao Luo, Haoteng Yan, Zhilin Long, Aiai Shi, Tingting Zhao, Yun Xiao, Xia Li, CancerSEA: a cancer single-cell state atlas…

在物联网软件开发中,常见的通信协议有哪些

在物联网 (IoT) 软件开发中&#xff0c;通信协议是关键部分&#xff0c;用于设备间以及设备与服务器之间的数据传输。以下是我收集总结的常见的通信协议及其特点&#xff1a; 1. 应用层协议 这些协议负责数据的格式化、传输和解读&#xff0c;常用于 IoT 设备与云服务或其他设…

React 的学习记录一:与 Vue 的相同点和区别

目录 一、学习目标 二、学习内容1️⃣——React的特点 1.组件化设计 2.单向数据流 3.声明式 UI 4.虚拟 DOM 5.Hooks 6.JSX 7.React Native 三、React与vue的比较总结 四、总结 一、学习目标 时间&#xff1a;两周 内容&#xff1a; React的特点React的入门React的…

深度学习-52-AI应用实战之基于Yolo8的目标检测自动标注

文章目录 1 YOLOv81.1 YOLOV8的不同版本1.2 可检测类别1.3 数据说明1.4 网络结构1.5 算法核心步骤2 目标检测的基本原理2.1 安装yolov8(cpu版本)2.2 图片检测2.3 视频检测2.4 自动标注2.5 保存标注结果3 参考附录1 YOLOv8 YOLOv8是一种前沿的计算机视觉技术,它基于先前YOLO版…

数据库管理-第267期 23ai:Oracle Data Redaction演示(20241128)

数据库管理267期 2024-11-286 数据库管理-第267期 23ai&#xff1a;Oracle Data Redaction演示&#xff08;20241128&#xff09;1 示例表及数据2 创建编校策略2.1 名字全编校2.2 电话部分编校 3 DML演示3.1 场景13.2 场景2 总结 数据库管理-第267期 23ai&#xff1a;Oracle Da…

hue 4.11容器化部署,已结合Hive与Hadoop

配合《Hue 部署过程中的报错处理》食用更佳 官方配置说明页面&#xff1a; https://docs.gethue.com/administrator/configuration/connectors/ 官方配置hue.ini页面 https://github.com/cloudera/hue/blob/master/desktop/conf.dist/hue.ini docker部署 注意&#xff1a; …

Vue 3 中实现页面特定功能控制

在开发 Vue 应用时&#xff0c;我们经常会遇到需要在特定页面启用或禁用某些功能的情况。本文将以 A父.vue 页面为例&#xff0c;探讨如何在点击汇总菜单时仅在该页面生效&#xff0c;而在其他页面不生效的问题。 1. 利用 Vue 3 的 provide 和 inject 实现状态传递 Vue 3 提供…

Spring Boot自定义启动banner

在启动 Springboot 应用时&#xff0c;默认情况下会在控制台打印出 Springboot 相关的banner信息。 自定义banner 如果你想自定义一个独特的启动banner&#xff0c;该怎么做呢&#xff1f;Springboot 允许我们通过自定义启动banner来替换默认的banner。只需要在 resources 目…

leaflet 的基础使用

目录 一、创建dom节点 二、创建地图 三、添加底图&#xff08;天地图&#xff09;&#xff0c;在地图创建完成后添加底图 本章主要讲述leaflet在vue中的使用&#xff1a; leaflet 详情总目录&#xff1a;传送 一、创建dom节点 <div class"map" id"map_…

C++分治思想

分治思想的定义 分治思想是C中很重要的一个思想&#xff0c;它的主旨是“将大的问题化作小的问题&#xff0c;将小问题在化作更小的问题”。就是这样一个看起来十分简单的思想&#xff0c;却涵盖了许许多多的算法&#xff0c;如递归&#xff0c;递推&#xff0c;贪心等。 分治…

ubuntu的用户使用

ubuntu系统中的常规用户登录方式 在系统root用户是无法直接登录的,因为root用户的权限过大所以其安全性比较差 在登录系统时一般使用在安装系统时建立的普通用户登录 如果需要超级用户权限: Ubuntu用户密码破解 在系统安装完成后默认grub启动等待时间为0&#xff0c;建议改…

浏览器拨测:将网站护航的阵地再前推一米

作者&#xff1a;泉思 “从你在地址栏里敲下回车开始到你在网页上看到内容中间经过了哪些步骤”&#xff0c; 这是一个非常常见的互联网公司的面试题。想必很多开发者对于这个问题可以给出一个非常完整的回答&#xff0c;但是对于用户来说&#xff0c;在网页上看到内容仅仅是服…

Modern Effective C++ 条款二十七:熟悉通用引用重载的替代方法

item26中说明对使用通用引用形参的函数&#xff0c;无论是独立函数还是成员函数&#xff0c;进行重载都会导致一系列问题。但是也提供了一些示例&#xff0c;如果能够按照我们期望的方式运行&#xff0c;重载可能也是有用的。这个条款探讨了几种通过避免在通用引用上重载的设计…

【RL Application】语义分割中的强化学习方法

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

【C++】优先队列(Priority Queue)全知道

亲爱的读者朋友们&#x1f603;&#xff0c;此文开启知识盛宴与思想碰撞&#x1f389;。 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 目录 一、前言 二、优先队列&#xff08;Priority Queue&#xff09…

【SQL】实战--组合两个表

题目描述 表: Person ---------------------- | 列名 | 类型 | ---------------------- | PersonId | int | | FirstName | varchar | | LastName | varchar | ---------------------- personId 是该表的主键&#xff08;具有唯一值的列&#xff09;…

STL:相同Size大小的vector和list哪个占用空间多?

在C中&#xff0c;vector和list是两种不同的序列容器。vector底层是连续的内存&#xff0c;而list是非连续的&#xff0c;分散存储的。因此&#xff0c;vector占用的空间更多&#xff0c;因为它需要为存储的元素分配连续的内存空间。 具体占用多少空间&#xff0c;取决于它们分…