这是悦乐书的第267次更新,第281篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第134题(顺位题号是581)。给定一个整数数组,找到一个连续的子数组,按升序对该子数组进行排序,使得整个数组也按升序排序。找到最短的无序连续子数组并输出其长度。例如:

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

输出:5

说明:按升序对[6,4,8,10,9]子数组进行排序,以使整个数组按升序排序。

注意:

  • 数组的长度在[1,100]范围内。

  • 数组可能包含重复项,因此这里的升序表示<=。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

特殊情况:数组第一个元素大于数组最后一个元素,直接返回整个数组的长度即可。

正常情况:使用两层for循环,外层循环每次获取到一个元素,内层循环就从其后面一位开始,往后比较,如果当前元素比后面的元素大,将其索引记录下来,如果后面遇到了更大的元素,就将索引更新为较大的索引,此索引将作为结束位置索引。

而外层循环用来参与比较的当前元素,在当前元素比后面的元素大时,保留当前元素的索引,如果后面继续出现,就取其中较小的,此索引将作为开始位置索引。最后,如果结束位置的索引值大于开始位置的索引值,就两者相减并加1,反之返回0,表示数组有序。

此解法的时间复杂度是O(n^2),空间复杂度是O(1)。

public int findUnsortedSubarray(int[] nums) {
if (nums[0] > nums[nums.length-1]) {
return nums.length;
}
int start = 0, end = nums.length;
for (int i=0; i<nums.length-1; i++) {
for (int j=i+1; j<nums.length; j++) {
if (nums[i] > nums[j]) {
start = Math.max(start, j);
end = Math.min(end, i);
}
}
}
return start - end > 0 ? start - end + 1 : 0;
}

03 第二种解法

特殊情况:数组第一个元素大于数组最后一个元素,直接返回整个数组的长度即可。

正常情况:将数组复制一份出来,然后对复制的数组进行排序,再和原数组进行比较,从头和尾分别循环比较,最后找到起始索引,做减法再加1,就是最短无序连续子数组的长度。

此解法的时间复杂度是O(n log(n)),空间复杂度是O(n)。

public int findUnsortedSubarray2(int[] nums) {
if (nums[0] > nums[nums.length-1]) {
return nums.length;
}
int[] temp = nums.clone();
Arrays.sort(temp);
int start = 0, end = nums.length-1;
while (start < nums.length && nums[start] == temp[start]) {
start++;
}
while (end > start && nums[end] == temp[end]) {
end--;
}
return end - start + 1;
}

04 第三种解法

定义数组的最大值为数组第一个元素,最小值为倒数第一个元素,从数组第二个元素开始,每次拿当前元素与最大值比较,取较大的一个,拿最小值与倒数第二个(从后往前递增)元素比较取较小的一个,如果最大值大于当前元素,就把当前元素的索引赋值给end,如果最小值小于倒数第二个(从后往前递增)元素,就把倒数第二个(从后往前)元素的索引值赋值给start,最后做减法再加1,要是数组是有序的,最后返回的是0,所以end的初始值为-2,start的初始值为-1。

次解法的时间复杂度是O(n),空间复杂度是O(1)。

public int findUnsortedSubarray3(int[] nums) {
if (nums[0] > nums[nums.length-1]) {
return nums.length;
}
int n = nums.length, start = -1, end = -2;
int min = nums[n - 1], max = nums[0];
for (int i = 1; i < n; ++i) {
max = Math.max(max, nums[i]);
min = Math.min(min, nums[n - 1 - i]);
if (max > nums[i]) {
end = i;
}
if (min < nums[n - 1 - i]) {
start = n - 1 - i;
}
}
return end - start + 1;
}

05 小结

算法专题目前已日更超过四个月,算法题文章134+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Shortest Unsorted Continuous Subarray(Java实现)的更多相关文章

  1. LeetCode算法题-Shortest Completing Word(Java实现)

    这是悦乐书的第309次更新,第330篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第178题(顺位题号是748).从给定的字典单词中查找最小长度单词,其中包含字符串lic ...

  2. 【LeetCode】581. Shortest Unsorted Continuous Subarray 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 方法一:排序比较 日期 题目地址:https://leetco ...

  3. 【leetcode】581. Shortest Unsorted Continuous Subarray

    题目如下: 解题思路:本题我采用的是最简单最直接最粗暴的方法,把排序后的nums数组和原始数组比较即可得到答案. 代码如下: /** * @param {number[]} nums * @retur ...

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

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

  5. 【leetcode_easy】581. Shortest Unsorted Continuous Subarray

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

  6. LeetCode算法题-Shortest Distance to a Character(Java实现)

    这是悦乐书的第321次更新,第343篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第191题(顺位题号是821).给定字符串S和字符C,返回一个整数数组,表示字符串中所有 ...

  7. LeetCode算法题-Path Sum III(Java实现)

    这是悦乐书的第227次更新 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第94题(顺位题号是437).您将获得一个二叉树,其中每个节点都包含一个整数值.找到与给定值相加的路径数 ...

  8. LeetCode算法题-Subdomain Visit Count(Java实现)

    这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...

  9. LeetCode算法题-Letter Case Permutation(Java实现)

    这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另 ...

随机推荐

  1. Java8 新特性 | 如何风骚走位防止空指针异常

    文章整理翻译自 https://winterbe.com/posts/2015/03/15/avoid-null-checks-in-java/ 文章首发于个人网站: https://www.exce ...

  2. wget Mac OS 下安装

    wget是一个从网络上自动下载文件的自由工具,支持通过HTTP.HTTPS.FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理. 下面介绍如何在Mac OS 下安装Wget 下载最新版的 ...

  3. MetaEditor中MQL使用方法

    MT4程序--帮助--MQL5文档,转到网页,切换到中文,点击旁边搜索图标. MetaEditor编辑器,点击相应关键字,按F1键,即可启动MT4对应的MQL4的对应关键字用法帮助.但是英文. 时间序 ...

  4. 『追捕盗贼 Tarjan算法』

    追捕盗贼(COCI2007) Description 为了帮助警察抓住在逃的罪犯,你发明了一个新的计算机系统.警察控制的区域有N个城市,城市之间有E条双向边连接,城市编号为1到N. 警察经常想在罪犯从 ...

  5. tensorflow机器学习模型的跨平台上线

    在用PMML实现机器学习模型的跨平台上线中,我们讨论了使用PMML文件来实现跨平台模型上线的方法,这个方法当然也适用于tensorflow生成的模型,但是由于tensorflow模型往往较大,使用无法 ...

  6. yum仓库的创建

    这篇博客是yum仓库的配置过程,如果是yum客户端配置请参考 http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_002.html 1 环境介 ...

  7. 设计模式总结篇系列:装饰器模式(Decorator)

    在面向对象设计过程中,经常会遇到需要对现有的类的功能进行扩展,通常我们可以采用继承的方式.例如老罗最近在做手机,一开始需要定义手机所应具有的功能: interface Phone{ public vo ...

  8. JVM(二)Java虚拟机组成详解

    导读:详细而深入的总结,是对知识"豁然开朗"之后的"刻骨铭心",想忘记都难. Java虚拟机(Java Virtual Machine)下文简称jvm,上一篇我 ...

  9. python基础6--面向对象基础、装饰器

    1.类 class Student: def __init__(self, name, grade): self.name = name self.grade = grade def introduc ...

  10. Django-restframework源码分析笔记

    在 APIview 类中的属性有一条是: authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES 定义了一个类属性为a ...