581. 最短无序连续子数组

581. 最短无序连续子数组

题目:

给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。

请你找出符合题意的 最短 子数组,并输出它的长度。

示例:

示例 1:

输入:nums = [2,6,4,8,10,9,15]
输出:5
解释:你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。

示例 2:

输入:nums = [1,2,3,4]
输出:0

示例 3:

输入:nums = [1]
输出:0

提示:

  • 1 <= nums.length <= 104
  • -105 <= nums[i] <= 105

**进阶:**你可以设计一个时间复杂度为 O(n) 的解决方案吗?

解题:

方法一:排序比较

从示例1可以得知,数组可以分为三部分,nums1部分,nums2部分,nums3部分。当进行升序排序之后发现nums1部分和nums3部分不会发生变化,因此只要nums1+nums3部分求出最大,则可以得到nums2部分最短。

基本思路是:把原来的数组复制到另一个数组中进行排序,然后两个数组进行比较,然后我们从左向右找到第一个两数组不同的位置,即为 nums2 的左边界。同理也可以找到 nums2 的右边界。最后我们输出 nums2 的长度即可。

class Solution {
public:int findUnsortedSubarray(vector<int>& nums) {if(is_sorted(nums.begin(),nums.end())) {// 如果数组已经是升序排序,返回0return 0;}vector<int> numsSorted(nums);sort(numsSorted.begin(), numsSorted.end());int left = 0;while(nums[left] == numsSorted[left]) {left++;}int right = nums.size()-1;while(nums[right] == numsSorted[right]) {right--;}return right-left+1;}
};

复杂度分析

  • 时间复杂度:O(nlog⁡n),其中 n 为给定数组的长度。我们需要 O(nlog⁡n) 的时间进行排序,以及 O(n) 的时间遍历数组,因此总时间复杂度为 O(n)。

  • 空间复杂度:O(n),其中 n 为给定数组的长度。我们需要额外的一个数组保存排序后的数组 numsSorted。

方法二:双指针一次遍历法

使用两个指针,一个从数组的开头向右移动,找到第一个无序的元素,另一个从数组的末尾向左移动,找到第一个无序的元素。然后,这两个指针之间的子数组就是我们要找的连续子数组。

class Solution {
public:int findUnsortedSubarray(vector<int>& nums) {int n = nums.size();//从左向右找到第一个无序的元素int left = 0;while(left < n-1 && nums[left] <= nums[left+1]) {left++;}// 如果数组已经有序,返回0if(left == n-1) {return 0;}//从右向左找到第一个无序的元素int right = n-1;while(right > 0 && nums[right] >= nums[right - 1]) {right--;}//找到无序子数组的最小值和最大值int min_val = INT_MAX, max_val = INT_MIN;for(int i = left; i <= right; ++i) {min_val = min(min_val, nums[i]);max_val = max(max_val, nums[i]);}// 扩展左边界while(left > 0 && nums[left - 1] > min_val) {left--;}// 扩展右边界while(right < n-1 && nums[right + 1] < max_val) {right++;}// 返回子数组的长度return right - left + 1;}
};

更加简洁的写法:

class Solution {
public:int findUnsortedSubarray(std::vector<int>& nums) {int n = nums.size();int maxn = INT_MIN, right = -1;  // 初始化最大值和右边界int minn = INT_MAX, left = -1;   // 初始化最小值和左边界for (int i = 0; i < n; i++) {// 从左向右遍历找到右边界if (maxn > nums[i]) {right = i;} else {maxn = nums[i];}// 从右向左遍历找到左边界if (minn < nums[n - i - 1]) {left = n - i - 1;} else {minn = nums[n - i - 1];}}// 如果 right 仍然是初始值 -1,表示数组已经有序,返回 0// 否则,返回无序子数组的长度return right == -1 ? 0 : right - left + 1;}
};
int main() {std::vector<int> nums = {2, 6, 4, 8, 10, 9, 15};Solution solution;int result = solution.findUnsortedSubarray(nums);std::cout << "最短无序连续子数组的长度为: " << result << std::endl;return 0;
}

不理解?没关系,根据例子看图说话!

在这里插入图片描述
复杂度分析

  • 时间复杂度:O(n),其中 n 是给定数组的长度,我们仅需要遍历该数组一次。
  • 空间复杂度:O(1)。我们只需要常数的空间保存若干变量。

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

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

相关文章

数字化非遗之光:十八数藏的文化保护之道

在当今数字化的时代&#xff0c;文化传承正经历着一场前所未有的转变&#xff0c;而十八数藏以其独特的方式成为数字化非遗的典范。这个项目不仅仅是数字技术的应用&#xff0c;更是一种文化的使命&#xff0c;一道保护非物质文化遗产的光芒。 十八数藏以数字化的手段保护非遗&…

五金零件经营小程序商城的效果如何

五金零件无论批发还是零售都有很高的需求度&#xff0c;传统消费者往往是线下门店寻找购买&#xff0c;但如今更多的客户选择线上消费&#xff0c;而商家们也选择线上开店拓展更广的客源及生意增长。 除了第三方平台进驻外&#xff0c;私域开店对商家来说也是一种方式。微信场…

如何用惯性动作捕捉系统,快速创建数字人三维动画?

在动画制作领域&#xff0c;惯性动作捕捉技术已经逐渐成为一种重要的制作手段。通过动捕设备能够将动捕演员真实的动作转化为数字数据&#xff0c;然后在动画中再现这些动作。为了创造出逼真、流畅的数字人动画&#xff0c;惯性动作捕捉系统成为了一大工具。 根据采集方式的不…

Vulnhub 解决虚拟机网络问题

前言&#xff1a; 有的时候&#xff0c;我们从vulnhub官网下载ovf文件导入到虚拟机后&#xff0c;使用扫描器扫描存活的时候发现扫不到靶机的IP&#xff0c;这是因为虚拟机的网卡配置有问题。我们需要进安全模式修改一些配置。 1. 在虚拟机开机的时候按一下上下键&#xff0c;让…

Wagtail-基于Python Django的内容管理系统CMS如何实现公网访问

Wagtail-基于Python Django的内容管理系统CMS实现公网访问 文章目录 Wagtail-基于Python Django的内容管理系统CMS实现公网访问前言1. 安装并运行Wagtail1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具3. 实现Wagtail公网访问4. 固定的Wagtail公网地址 前言 Wagtail是一个…

代码随想录二刷 | 链表 |链表相交

代码随想录二刷 &#xff5c; 链表 &#xff5c;链表相交 题目描述解题思路 & 代码实现 题目描述 160.链表相交 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 题目数据 保…

万界星空科技QMS质量管理系统功能

QMS质量管理系统结合质量决策、综合质量管理、过程质量控制三个层次要素&#xff0c;帮助企业实现产品全寿命周期质量数据的及时、灵活、准确和全面采集。 通过质量管理软件能够实现质量数据科学处理和应用&#xff0c;包括数据的系统化组织、结构化存贮、便捷式查询、定制化统…

什么是搜索相关性?AI如何驱动搜索相关性?

训练数据驱动机器学习&#xff0c;机器学习促进丰富的人机交互体验。在快速迭代的互联网时代&#xff0c;我们不断被各种广告铺盖&#xff0c;甚至经常细思极恐&#xff0c;“天呐&#xff0c;小红书怎么知道我面膜没了。”这都是算法和机器学习的鬼斧神工洞察着用户的搜索意图…

低代码:数字化转型趋势下的快速开发方式

目录 一、前言 二、低代码是什么&#xff1f; 三、低代码如何提高生产力 开发工具JNPF介绍 产品分析 1可视化应用开发 2流程管理 3整个平台源码合作 四、小结 一、前言 通常&#xff0c;开发一个大型的企业级系统&#xff0c;公司往往需要大量的人力做支持后盾&#xff0c;如需…

时态图根据时间轴动态播放热力图

效果图如下&#xff1a; <!DOCTYPE html> <html><head><title>时态图</title><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><!-- 引入样式 --&g…

【高级网络程序设计】Week3-2 Servlet

一、 What are servlets? 1. 定义 &#xff08;1&#xff09;Servlets are Java’s answer to CGI&#xff1a; programs that run on a web server acting as middle layer between HTTP request and databases or other applications.Used for client requests that cann…

人工智能和AR/VR:AI在AR和VR中扮演什么角色?行业应用有哪些?

增强现实技术和虚拟现实技术&#xff08;AR/VR&#xff09;发展前景广阔&#xff0c;备受各大企业关注。事实上&#xff0c;近四分之三的行业领导者表示&#xff0c;他们预计这些沉浸式技术将于未来五年内成为主流。高盛公司报告称&#xff0c;到2025年&#xff0c;AR/VR行业值…

Golang版本处理Skywalking Trace上报数据

Tips: 中间记录了解决问题的过程&#xff0c;如不感兴趣可直接跳至结尾 首先去es里查询skywalking trace的元数据 可以拿到一串base64加密后的data_binary(直接解密不能用&#xff0c;会有乱码&#xff0c;可参考https://github.com/apache/skywalking/issues/7423) 对data_b…

图解系列--密钥,随机数,应用技术

密钥 1.生成密钥 1.1.用随机数生成密钥 密码学用途的伪随机数生成器必须是专门针对密码学用途而设计的。 1.2.用口令生成密钥 一般都是将口令输入单向散列函数&#xff0c;然后将得到的散列值作为密钥使用。 在使用口令生成密钥时&#xff0c;为了防止字典攻击&#xff0c;需要…

笔记本只使用Linux是什么体验?

笔记本只使用Linux是什么体验&#xff1f; 之后安了Windows双系统之后也不怎么想再进Windows了。 开发环境就不用说了&#xff0c;Linux下配各种开发环境都方便的多&#xff0c;当然你要用 vs 那还是乖乖回 Windows 吧。 最近很多小伙伴找我&#xff0c;说想要一些Linux的资…

详解Java的static关键字

文章目录 &#x1f384;静态方法&#x1f33a;静态方法和非静态方法对比&#x1f6f8;静态方法实例&#x1f6f8;非静态方法实例 &#x1f339;static关键字⭐static变量⭐static代码块 &#x1f384;静态方法 不依赖于对象实例&#xff1a;静态方法不需要依赖于任何对象实例&…

java的继承特性和方法重写

java的继承特性和方法重写 Java的继承特性是一种面向对象编程的重要概念&#xff0c;它允许我们基于已有的类创建新的类&#xff0c;并且保留了已有的类的一些特性。这是通过使用"继承"这个关键词来实现的&#xff0c;新创建的类称为子类&#xff08;subclass&#…

Spark---核心介绍

一、Spark核心 1、RDD 1&#xff09;、概念&#xff1a; RDD&#xff08;Resilient Distributed Datest&#xff09;&#xff0c;弹性分布式数据集。 2&#xff09;、RDD的五大特性&#xff1a; 1、RDD是由一系列的partition组成的 2、函数是作用在每一个partition(split…

Linux 磁盘/分区/修复 命令

目录 1. lsblk&#xff08;list block devices&#xff09; 2. fdisk&#xff08;fragment disk&#xff09; 3. gdisk 4. mkfs&#xff08;make filesystem&#xff09; 5. df&#xff08;display file-system disk space usage&#xff09; 6. du 7. fsck&#xff08;file-sy…

Android修行手册-POI操作Excel文档

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…