问题

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

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

输入: [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. 软件测试大牛都是这样写测试用例的,你get到了嘛?

    1. 用于语句覆盖的基路径法 基路径法保证设计出的测试用例,使程序的每一个可执行语句至少执行一次,即实现语句覆盖.基路径法是理论与应用脱节的典型,基本上没有应用价值,读者稍作了解即可,不必理解和掌握. ...

  2. ubuntu 下安装QQ TIM QQ轻聊版 微信 Foxmail 百度网盘 360压缩 WinRAR 迅雷极速版

    第1步,安装deepin-wine环境:上https://github.com/wszqkzqk/deepin-wine-ubuntu页面下载zip包(或用git方式克隆),解压到本地文件夹,在文件夹 ...

  3. Python Ethical Hacking - NETWORK_SCANNER(1)

    NETWORK_SCANNER Discover all devices on the network. Display their IP address. Display their MAC add ...

  4. Ethical Hacking - NETWORK PENETRATION TESTING(8)

    WEP Cracking Basic case Run airdump-ng to log all traffic from the target network. airodump-ng --cha ...

  5. STL Stack(栈)学习笔记 + 洛谷 P1449 后缀表达式

    稍微看了看刘汝佳的白皮书,“实用主义”的STL实在是香到我了,而且在实验室大佬的推荐下我开始了stl的学习. 每篇附带一个题目方便理解,那行,直接开始. 毕竟是实用主义,所以就按照给的题目的例子来理解 ...

  6. flask下直接展示mysql数据库 字段

    在工作中,会导出一份mysql的html来查看,用的是就是路过秋天大神的那个工具,所以想自己用那个样式直接在后端写一个页面做展示! 前端页面 from flask import Flask,reque ...

  7. 2016A06寒假作业 全排列

    又是一个全排列哈, 注意注意,这个题不是十三个数字都需要,但原理是一样的 一开始把for的边界写错了(每次其实应该从k开始,还没看出来orz) #include <iostream> #i ...

  8. Hexo博客美化之蝴蝶(butterfly)主题魔改

      Hexo是轻量级的极客博客,因为它简便,轻巧,扩展性强,搭建部署方便深受广大人们的喜爱.各种琳琅满路的Hexo主题也是被各种大佬开发出来,十分钦佩,向大佬仰望,大声称赞:流批!!! 我在翻看各种主 ...

  9. 基于个人理解的springAOP部分源码分析,内含较多源码,慎入

    本文源码较多,讲述一些个人对spring中AOP编程的一个源码分析理解,只代表个人理解,希望能和大家进行交流,有什么错误也渴求指点!!!接下来进入正题 AOP的实现,我认为简单的说就是利用代理模式,对 ...

  10. PHP strcspn() 函数

    实例 输出在字符串 "Hello world!" 中找到字符 "w" 之前查找的字符数: <?php高佣联盟 www.cgewang.comecho st ...