最短无序连续子数组

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

你找到的子数组应是最短的,请输出它的长度。

示例 1:

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

输出: 5

解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。

说明 :

  1. 输入的数组长度范围在 [1, 10,000]。
  2. 输入的数组可能包含重复元素 ,所以升序的意思是<=。

  题目给了我们一个nums array, 让我们找出一个最短的无序连续子数组,当我们把这个子数组排序之后,整个array就已经是排序的了。

  要找到这个子数组的范围,先要了解这个范围的beg 和 end 是如何定义的。

  来看这个例子:1 3 5 7 2 4 5 6

  a. 当我们找到第一个违反ascending 排序的数字 2的时候,我们不能是仅仅把beg 标记为2的前面一个数字7,而是要一直往前,找到一个合适的位置,找到在最前面位置的比2大的数字,这里是3。

  b. 同样的,为了找end, 那么我们要从7的后面开始找,一直找到一个最后面位置的比7小的数字,这里是6。

  这样的话,范围就是3到6 是我们要找的子数组。把3到6排序完了之后,整个array 就已经是排序的了。

  这里我们可以发现,2是min, 7是max,所以我们可以分两个方向来分别寻找beg 和end。

  从右到左(绿色),维护更新min 和 beg;

  从左到右(红色),维护更新max 和 end。

 1 class Solution
 2 {
 3     public int findUnsortedSubarray(int[] nums)
 4     {
 5         int n = nums.length;
 6         int beg = -1;
 7         int end = -2; // end is -2 is because it works if the array is already in ascending order
 8         int min = nums[n-1]; // from right to left
 9         int max = nums[0];      // from left to right
10
11         for(int i=0; i<n; i++)
12         {
13             max = Math.max(max, nums[i]);
14             min = Math.min(min, nums[n-1-i]);
15
16             if(nums[i] < max)
17                 end = i;
18             if(nums[n-1-i] > min)
19                 beg = n-1-i;
20         }
21
22         return end - beg + 1; // if array is already in ascending order, -2 - (-1) + 1 = 0
23     }
24 }

转载于:https://www.cnblogs.com/kexinxin/p/10381393.html

Leetcode 581.最短无序连续子数组相关推荐

  1. LeetCode 581. 最短无序连续子数组(Shortest Unsorted Continuous Subarray)

    581. 最短无序连续子数组 581. Shortest Unsorted Continuous Subarray 题目描述 给定一个整型数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序 ...

  2. 【LeetCode】【HOT】581. 最短无序连续子数组

    [LeetCode][HOT]581. 最短无序连续子数组 文章目录 [LeetCode][HOT]581. 最短无序连续子数组 package hot;public class Solution58 ...

  3. 581. 最短无序连续子数组 golang

    581. 最短无序连续子数组 给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 你找到的子数组应是最短的,请输出它的长度. 示例 1: 输入: ...

  4. 581. 最短无序连续子数组

    给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 请你找出符合题意的 最短 子数组,并输出它的长度. 示例 1: 输入:nums ...

  5. 【LeetCode笔记】581. 最短无序连续子数组(Java、数组)

    文章目录 题目描述 思路 && 代码 1. 排序法 O(nlogn).O(n) 2. 记录 max[ ].min[ ] 的写法 O(n).O(n) 3. 记录 max.min 的写法 ...

  6. LeetCode 581. 最短无序连续子数组 (unfinished 排序+双指针)

    581. 最短无序连续子数组 class Solution {public:int findUnsortedSubarray(vector<int>& nums) {vector& ...

  7. LeetCode 581. 最短无序连续子数组(排序单调栈)

    文章目录 1. 题目 2. 解题 2.1 排序 2.2 4次遍历 2.3 单调栈 1. 题目 给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. ...

  8. 最短无序连续子数组—leetcode581

    给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 你找到的子数组应是最短的,请输出它的长度. 示例 1: 输入: [2, 6, 4, 8, 1 ...

  9. leetcode 581. 最短无序连续子数组(详解普通 / 进阶 / 单调栈解法,Java版)

    题目 题解 方法1(暴力排序):时间复杂度O(nlogn),空间复杂度O(n) 一个简单的想法是:将数组 nums 进行排序,记为 nums_sorted .然后比较 nums 和 nums_sort ...

最新文章

  1. selenium常用命令之操作页面元素及获取元素内容的事件整理
  2. 微软获 OpenAI 独家 GPT-3 模型授权,是潘多拉还是聚宝盆?
  3. 华为服务器面板显示,服务器面板怎么查看
  4. 设计中最常用的CSS选择器
  5. 记事本写python怎么运行-Python开发简单记事本
  6. breeze源码阅读心得
  7. 【Hibernate框架开发之五】Hibernate对象的三种状态Session常用方法
  8. 发送图片微博_微博引流之(实时号养成内幕解析)!
  9. Oracle 11g R2手动配置EM(转)
  10. 组合总和(可重复使用)Python解法
  11. 刘朋:从技术到管理 - 团队制胜六步工作法(开篇)
  12. js函数、作用域和闭包
  13. matlAB gui 变成c,matlab改变GUI和figure左上角图标的方法,并生成exe文件
  14. C++中vector的访问和赋值
  15. 签到界面加图片java_签到功能实现,没有你想的那么复杂(二)
  16. centos下ftp服务器搭建
  17. 基于SRP创建自定义渲染管线
  18. 力扣刷题-动态规划算法3:完全背包问题
  19. 百度排名批量查询_白杨SEO:一文告诉你SEO站长综合查询工具5118功能使用大全!...
  20. C语言中char字符为0时的情况,c语言中char的用法

热门文章

  1. oracle 11g crs stat,Oracle 11g RAC CRS磁盘丢失后恢复
  2. 计算机一级和答案,全国计算机一级操作题及答案
  3. 人工智能是计算机科学的一个分支下定义,阅读中有一篇叫人工智能什么,是说明文...
  4. access集团和abm_abm展示硬核实力,ACCESS集团携8大国际品牌在进博会首秀!
  5. linux 安装org2pg_Ora2Pg的安装和使用
  6. Spark 读写 Es
  7. 网页另存显示不全_word另存为选项没有PDF格式怎么办?别忘了还有这招!
  8. python︱Anaconda安装、简介(安装报错问题解决、Jupyter Notebook)
  9. [Hbase]Hbase常用的优化方法
  10. [深度学习]大白话之卷积神经网络