【LeetCode】581. 最短的无排序连续子数组

2023-12-27 14:58

本文主要是介绍【LeetCode】581. 最短的无排序连续子数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述

Given an integer array, you need to find one continuous subarray that if you only sort this subarray in ascending order, then the whole array will be sorted in ascending order, too.

You need to find the shortest such subarray and output its length.

Note:

  1. Then length of the input array is in range [1, 10,000].
  2. The input array may contain duplicates, so ascending order here means <=.

给定一个整数数组,你需要找到一个连续的子数组,如果只按升序对这个子数组排序,那么整个数组也将按升序排序。
你需要找到最短的子数组并输出它的长度。

注意:
那么输入数组的长度在[1,10,000]范围内。
输入数组可能包含重复项,所以这里升序表示<=。

输入: [2, 6, 4, 8, 10, 9, 15]
输出: 5

 

Python 实现

实现一:排序后再通过比较找出边界。简单粗暴的方法,直接上代码。

class Solution(object):def findUnsortedSubarray(self, nums):""":type nums: List[int]:rtype: int"""length = len(nums)if length <= 1:return 0arr = sorted(nums)length = len(nums)for i in range(length):if arr[i] != nums[i]:breakfor j in range(length, 0, -1):if arr[j-1] != nums[j-1]:breakif j-1 < i:return 0else:return j-i

实现二:寻找左右两个边界。思路和冒泡排序法有点类似,但我们并不是真的进行排序。我们知道,冒泡排序法就是遍历时将前后两个元素进行对比,(假设是升序排序)较大值会被交换到靠后的位置。在这一道题目里,我们不把较大值交换到靠后的位置,而是记录这个最大值,并以之为比较标准,位置靠后且小于该最大值的元素,必然是整个数组排序时需要考虑的部分,也就是我们所要求的最短无排序连续子数组的元素之一,因此我们记录下最靠后的最小值的索引,即为所求子数组的右边界。同理,从右往左遍历,相当于通过冒泡排序法排成降序的形式,我们记录中间出现的最小值作为比较对象,记录最后出现的较大值的索引,即为左边界。

使用上述方法,最多需要遍历两次数组(前后各一次),需要4个变量来记录最大值、最小值、左边界、右边界,因此时间复杂度为 O(n),空间复杂度为 O(1)。

class Solution(object):def findUnsortedSubarray(self, nums):""":type nums: List[int]:rtype: int"""length = len(nums)if length <= 1:return 0left = right = -1maxEdge = nums[0]minEdge = nums[length-1]for i in range(1, length):maxEdge = max(maxEdge, nums[i])if maxEdge > nums[i]:right = iif right == -1:return 0for j in range(length-1, 0, -1):minEdge = min(nums[j-1], minEdge)if minEdge < nums[j-1]:left = j-1return right - left + 1

链接:https://leetcode.com/problems/shortest-unsorted-continuous-subarray/

 

这篇关于【LeetCode】581. 最短的无排序连续子数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/543513

相关文章

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

Python中lambda排序的六种方法

《Python中lambda排序的六种方法》本文主要介绍了Python中使用lambda函数进行排序的六种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1.对单个变量进行排序2. 对多个变量进行排序3. 降序排列4. 单独降序1.对单个变量进行排序

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c