问题

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

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

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

输出: 5

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

说明 :

输入的数组长度范围在 [1, 10,000]。

输入的数组可能包含重复元素 ,所以升序的意思是<=。


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.

Input: [2, 6, 4, 8, 10, 9, 15]

Output: 5

Explanation: You need to sort [6, 4, 8, 10, 9] in ascending order to make the whole array sorted in ascending order.

Note:

Then length of the input array is in range [1, 10,000].

The input array may contain duplicates, so ascending order here means <=.


示例

public class Program {

    public static void Main(string[] args) {
int[] nums = null; nums = new int[] { 2, 6, 4, 8, 10, 9, 15 };
var res = FindUnsortedSubarray(nums);
Console.WriteLine(res); res = FindUnsortedSubarray2(nums);
Console.WriteLine(res); res = FindUnsortedSubarray3(nums);
Console.WriteLine(res); Console.ReadKey();
} private static int FindUnsortedSubarray(int[] nums) {
var newNums = new int[nums.Length];
Array.Copy(nums, newNums, nums.Length);
Array.Sort(newNums);
//先排序并赋初始值
int begin = 0, end = nums.Length - 1;
//如果之前的数据就在正确的位置上,就移动指针位置
while(nums[begin] == newNums[begin] && begin < end)
begin++;
while(nums[end] == newNums[end] && begin < end)
end--;
//相等时,代表之前就是有序的
if(begin == end)
return 0;
else
return end - begin + 1;
} private static int FindUnsortedSubarray2(int[] nums) {
//FindUnsortedSubarray的优化写法
var newNums = new int[nums.Length];
Array.Copy(nums, newNums, nums.Length);
Array.Sort(newNums);
int begin = -1, end = -2;
for(int i = 0; i < nums.Length; i++) {
if(nums[i] != newNums[i]) {
if(begin == -1)
begin = i;
end = i;
}
}
return end - begin + 1;
} private static int FindUnsortedSubarray3(int[] nums) {
//此解法参考英文官方LeetCode上的讨论
//CSDN和cnblog上关于此解法讨论基本上都是错误的
//很多博主参考此解法给出了正确的实现,但是解释的均不对
//至少我本人没有发现任何一篇的解释是对的,经不起推敲,一个反例即可
//其实这个解法和FindUnsortedSubarray解法的基本思路类似
//从左到右(或从右到左)找最小值(或最大值),看这个最小值(或最大值)是否在其应该存在的地方
//例如第1次,找出数组中第1小的值,看其是不是在索引为0的地方
//如果不是,查找结束,start为0
//如果是,找出数组中第2小的值,看其是不是在索引为1的地方
//以此类推,从右向左找最大值的方式类似
//以上分析才是这个解法的精髓所在,思路同FindUnsortedSubarray
//但解法巧妙至极,是一种高度优化的写法
int n = nums.Length;
//赋初始开始和结束值
int start = -1;
int end = -2;
//结束值赋为-2是考虑在数组本身就是有序时
//最后一句的return也可以给出正确值
//因为 end = i 没有被执行
int min = nums[n - 1];
int max = nums[0];
//
for(int i = 0, pos = 0; i < n; i++) {
pos = n - 1 - i;
//找出局部最大、最小值
max = Math.Max(max, nums[i]);
min = Math.Min(min, nums[pos]);
//如果当前值小于局部最大值,重置end
if(nums[i] < max)
end = i;
//如果当前值大于局部最小值,重置start
if(nums[pos] > min)
start = pos;
}
//返回开始和结束的索引差
//假如是1、2,2 - 1 + 1 = 2,因为1,2是2个值
return end - start + 1;
} }

以上给出3种算法实现,以下是这个案例的输出结果:

5
5
5

分析:

显而易见,FindUnsortedSubarray和FindUnsortedSubarray2的时间复杂度基于 Array.Copy() 所使用的排序算法,FindUnsortedSubarray3的时间复杂度为:  。

C#LeetCode刷题之#581-最短无序连续子数组( Shortest Unsorted Continuous Subarray)的更多相关文章

  1. [Swift]LeetCode581. 最短无序连续子数组 | Shortest Unsorted Continuous Subarray

    Given an integer array, you need to find one continuous subarray that if you only sort this subarray ...

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

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

  3. Java实现 LeetCode 581 最短无序连续子数组(从两遍搜索找两个指针)

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

  4. [LeetCode] 581. 最短无序连续子数组 ☆

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

  5. Leetcode 581.最短无序连续子数组

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

  6. [LeetCode] Shortest Unsorted Continuous Subarray 最短无序连续子数组

    Given an integer array, you need to find one continuous subarray that if you only sort this subarray ...

  7. LeetCode算法题-Shortest Unsorted Continuous Subarray(Java实现)

    这是悦乐书的第267次更新,第281篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第134题(顺位题号是581).给定一个整数数组,找到一个连续的子数组,按升序对该子数组 ...

  8. 581. Shortest Unsorted Continuous Subarray

      Given an integer array, you need to find one continuous subarray that if you only sort this subarr ...

  9. 【leetcode_easy】581. Shortest Unsorted Continuous Subarray

    problem 581. Shortest Unsorted Continuous Subarray 题意:感觉题意理解的不是非常明白. solution1: 使用一个辅助数组,新建一个跟原数组一模一 ...

随机推荐

  1. C#/VB.NET 在Word中添加条码、二维码

    本文介绍如何通过C# 和VB.NET代码实现在Word文档中添加条码和二维码.代码中将分为在Word正文段落中.页眉页脚中等情况来添加. 使用工具:Free Spire.Office for .NET ...

  2. Goorm永久免费的VPS

    简介 咱在LOC(某知名主机论坛)看到的,当个容器玩玩还是不错的,不过10分钟后会休眠,目前还没有大佬可以解决,可以使用SSH连接,适合折腾,不适合建站等生产环境操作,请注意.https://www. ...

  3. C# 判断和创建目录路径

    在进行一些导出或下载时,需要创建一个本地路径,以供文件进行下载和创建. if (Directory.Exists(Server.MapPath("~/upimg/hufu")) = ...

  4. bootstrap插件-滚动监听

    代码 引入bootstrap.js 和bootstrap.css两个文件 <!DOCTYPE html> <html> <head> <meta charse ...

  5. 第二章 Java基础知识(下)

    2.1.分支结构(if.switch) 2.1.1.if语句 格式一: if (关系表达式) { 语句体; } 流程一: ①首先计算关系表达式的值 ②如果关系表达式的值为true就执行语句体 ③如果关 ...

  6. 渲染导航菜单的同时给每个菜单绑定不同的router跳转

    这个问题一开始的时候,我总想着router跳转只有两种方式 一种@click,一种router-link 然后我想着@click,绑定一个事件,事件下面无法确定我当前是哪个菜单,解决不了. 然后< ...

  7. Python游戏编程入门 中文pdf扫描版|网盘下载内附地址提取码|

    Python是一种解释型.面向对象.动态数据类型的程序设计语言,在游戏开发领域,Python也得到越来越广泛的应用,并由此受到重视. 本书教授用Python开发精彩游戏所需的[]为重要的该你那.本书不 ...

  8. Python模块_import语句_from...import 函数名_from ... import *

    Python模块:包含了所有定义的函数和变量的文件,后缀名为 .py 将某些方法存放在文件中,当某些脚本 或 交互式需要使用的时候,导入进去. 导入的文件,就称为模块.导入之后就可以使用导入的文件的函 ...

  9. Django学习路25_ifequal 和 ifnotequal 判断数值是否相等及加减法 {{数值|add 数值}}

    {% ifequal 数值 数值 %} <body> {# 判断是否相等 #} num 当前的值 {{ num }}<br/> {% ifequal num 5 %} {# 判 ...

  10. GitOps初阶指南:将DevOps扩展至K8S

    本文转自Rancher Labs 在过去十年的编程中,出现了一些革命性的转变.其中之一是源于围绕DevOps的实践,它将开发和运维团队整合到一个共享的工作流程中,此外还有持续集成和持续交付(CI/CD ...