这是悦乐书的第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. mockjs,json-server一起搭建前端通用的数据模拟框架

    无论是在工作,还是在业余时间做前端开发的时候,难免出现后端团队还没完成接口的开发,而前端团队却需要实现对应的功能,不要问为什么,这是肯定存在的.本篇文章就是基于此原因而产出的.希望对有这方面的需求的同 ...

  2. 代理自动配置文件PAC的使用方法

    我通常上网使用两个浏览器,safari用于一般上网:Chrome安装SwitchyOmega插件,在不同的代理中切换,来保证某些网站的上网速度. 但是这种方式到了手机上就有点懵,几乎所有的iPhone ...

  3. .NET应用程序管理服务AMS设计

    AMS全称是Application Management Server即应用程序管理服:由于经常要写些一些应用服务,每次部署和维护都比较麻烦,首先要针对服务编写一个windows服务程序方便系统启动里 ...

  4. SpringBoot入门教程(二)CentOS部署SpringBoot项目从0到1

    在之前的博文<详解intellij idea搭建SpringBoot>介绍了idea搭建SpringBoot的详细过程, 并在<CentOS安装Tomcat>中介绍了Tomca ...

  5. springboot+mybatis+dubbo+aop日志第一篇

    本篇文章主要讲述项目搭建过程,不会涉及过多的基础知识,本项目是作者对前段时间学习的一个总结,主要使用到技术有:maven父子工程.springboot.mybatis.dubbo.zookeeper. ...

  6. NTP服务器搭建

    NTP服务器搭建 :http://www.jbxue.com/LINUXjishu/22352.html 客户端配置: vim /etc/ntp.conf #server 0.centos.pool. ...

  7. Mac homebrew-1.5以后安装php扩展的方法

    一.以前Mac安装php及php扩展的方式 用Mac的童鞋都知道,我们以前都是用brew install php70,brew install php71 这样来安装php的,用brew instal ...

  8. [Luogu4705] 玩游戏

    Description 给定两个长度分别为 \(n\) 和 \(m\) 的序列 \(a\) 和 \(b\).要从这两个序列中分别随机一个数,设为 \(a_x,b_y\),定义该次游戏的 \(k\) 次 ...

  9. Perl获取主机名、用户、组、网络信息

    获取主机名.用户.组.网络信息相关函数 首先是获取主机名的方式,Perl提供了Sys::Hostname模块,可以查询当前的主机名: use Sys::Hostname; print hostname ...

  10. vs2017安装pygame,vs2017安装python第三方包

    vs2017有独立的python环境:所以想在vs2017开发python并使用第三方包,需要在vs2017中操作,完成第三方包的安装. 一,查看vs2017有哪些版本的python,当前使用的是哪个 ...