【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

相关文章

哈希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

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj2406(连续重复子串)

题意:判断串s是不是str^n,求str的最大长度。 解题思路:kmp可解,后缀数组的倍增算法超时。next[i]表示在第i位匹配失败后,自动跳转到next[i],所以1到next[n]这个串 等于 n-next[n]+1到n这个串。 代码如下; #include<iostream>#include<algorithm>#include<stdio.h>#include<math.

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

hdu 1285(拓扑排序)

题意: 给各个队间的胜负关系,让排名次,名词相同按从小到大排。 解析: 拓扑排序是应用于有向无回路图(Direct Acyclic Graph,简称DAG)上的一种排序方式,对一个有向无回路图进行拓扑排序后,所有的顶点形成一个序列,对所有边(u,v),满足u 在v 的前面。该序列说明了顶点表示的事件或状态发生的整体顺序。比较经典的是在工程活动上,某些工程完成后,另一些工程才能继续,此时

XTU 1233 n个硬币连续m个正面个数(dp)

题面: Coins Problem Description: Duoxida buys a bottle of MaiDong from a vending machine and the machine give her n coins back. She places them in a line randomly showing head face or tail face o

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists