LeetCode HOT 100 —— 581. 最短无序连续子数组

news/2025/1/11 10:04:14/

题目

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

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

在这里插入图片描述

思路

方法一:双指针 + 排序

最终目的是让整个数组有序,那么可以先将数组拷贝一份进行排序,然后使用两个指针 ij分别找到左右两端第一个不同的地方,那么 [i,j]这一区间即是答案

在这里插入图片描述
java代码如下:

class Solution {public int findUnsortedSubarray(int[] nums) {int n = nums.length;int[] arr = nums.clone();//java中的clone对于一维数组是深拷贝,重新分配空间,并将元素复制过去,对clone后的数组进行修改不会影响源数组。但是对二维数组是浅拷贝,复制的是引用,实际上指向的是同一个地址,对拷贝的二维数组修改或者排序都会影响原二维数组Arrays.sort(arr);int i = 0, j = n - 1;while (i <= j && nums[i] == arr[i]) i++;while (i <= j && nums[j] == arr[j]) j--;return j - i + 1;}
}

方法二:双指针 + 线性扫描(一次遍历)

将整个数组分成三段处理,一次遍历

正常排序(1 2 3 4 5): 左边所有元素的最大值(2) <= 每个元素(例如3) <= 右边所有元素的最小值(4)

求解: 2 6 8 10 4 9 15
其中:
从左到右 9是最后一个小于 (左边所有元素最大值)的
从右到左 6是最后一个大于 (右边所有元素最小值)的

故解为求:

  • 从左到右遍历, 记录当前遍历数的最大值, 最后一个小于最大值的即 需要倒置数组的右边边界索引
  • 从右到左遍历, 记录当前遍历数的最小值, 最后一个大于最小值的即 需要倒置数组的左边边界索引

java代码如下(算法有点晦涩难懂,建议跟着例子在纸上走一遍):

class Solution{public int findUnsortedSubarray(int[] nums) {int length = nums.length;int leftDiff = -1;int rightDiff = -1;//最大值是顺序遍历使用的(求需排序数组的右边边界索引rightDiff), 也可以取Integer.MIN_VALUEint max = nums[0];//最小值是倒序遍历使用的(求需排序数组的左边边界索引leftDiff), 也可以取Integer.MAX_VALUEint min = nums[length - 1];for (int i = 0; i < length; i++) {//顺序执行, 判断 当前值是否小于 已遍历的最大值, 是的话属于需排序的数组元素, 替换rightDiff; 否就更新最大值if (nums[i] < max){rightDiff = i;} else {max = nums[i];}//倒序执行, 判断 当前值是否大于 已遍历的最小值, 是的话属于需排序的数组元素, 替换leftDiff; 否就更新最小值int index = length - 1 - i;if (nums[index] > min){leftDiff = index;} else {min = nums[index];}}return leftDiff != -1 ? rightDiff - leftDiff + 1 : 0;}
}

http://www.ppmy.cn/news/6231.html

相关文章

Python求多元函数的极小值

文章目录minimize_scalarminimize测试minimize_scalar 此为scipy中用于求函数最小值的方法&#xff0c;输入参数如下 minimize_scalar(fun, bracketNone, boundsNone, args(), methodbrent, tolNone, optionsNone)[source]其中&#xff0c;必选的参数只有一个&#xff0c;就是…

【算法】P1 算法简介

算法什么是算法正确与错误的算法算法可以解决什么问题本专栏有哪些算法什么是算法 算法 (Algorithm) 取某个值或集合作为 输入&#xff0c;并产生某个值或集合作为 输出。算法就是把输入转换为输出的计算&#xff0c;描述这个计算的过程来实现输入与输出的关系。 正确与错误的…

业聚医疗在港交所上市:市值约76亿港元,钱永勋、刘桂祯夫妇控股

12月23日&#xff0c;业聚医疗集团控股有限公司&#xff08;下称“业聚医疗”&#xff0c;HK:06929&#xff09;在港交所上市。本次上市&#xff0c;业聚医疗的发行价为8.80港元/股&#xff0c;全球发行发售5463.30万股&#xff0c;募集资金总额约为4.81亿港元&#xff0c;募资…

12【SpringMVC的异常处理】

文章目录六、SpringMVC的异常处理6.1 SpringMVC异常概述6.2 SpringMVC异常处理6.2.1 单个类处理方式6.2.2 处理全局异常6.2.3 注解方式实现全局异常六、SpringMVC的异常处理 6.1 SpringMVC异常概述 我们在处理异常时&#xff0c;通常使用try…catch块来处理程序中发生的异常&…

Hadoop综合项目——二手房统计分析(MapReduce篇)

Hadoop综合项目——二手房统计分析&#xff08;MapReduce篇&#xff09; 文章目录Hadoop综合项目——二手房统计分析&#xff08;MapReduce篇&#xff09;0、 写在前面1、MapReduce统计分析1.1 统计四大一线城市房价的最值1.2 按照城市分区统计二手房数量1.3 根据二手房信息发布…

直播弹幕系统(六)- SpringBoot + STOMP + RabbitMQ(使用MQ替代Spring代理)

直播弹幕系统&#xff08;六&#xff09;- SpringBoot STOMP RabbitMQ&#xff08;使用MQ替代Spring代理&#xff09;前言一. SpringBoot整合RabbitMQ代理Broker1.1 RabbitMQ安装STOMP插件&#xff08;Docker&#xff09;1.2 RabbitMQ相关准备1.3 其他代码二. 前端整合Rabbit…

STM32三条总线(AHB、APB1、APB2)的外设映射情况

STM32三条总线&#xff08;AHB、APB1、APB2&#xff09;的外设映射情况 1、AHB (1)Flash储存器 (2)DMA (3)复位和时钟控制 (4)CRC (5)以太网 (6)SDIO 2、APB1总线(支持低速状态下的工作) (1)定时器TIM2到TIM7 (2)RTC (3)WDT看门狗 (4)SPI2、SPI3 (5)USART2、USART3 (6)UART4、U…

JavaSE基础篇:枚举

文章部分内容整理自知乎Peter McLeish的回答第一章&#xff1a;枚举类一&#xff1a;自定义一个枚举类二&#xff1a;JDK提供的枚举类型三&#xff1a;枚举中静态代码块的执行顺序第一章&#xff1a;枚举类 枚举类&#xff1a;类的对象只有有限个&#xff0c;且是确定的 Java…