LeetCode算法题-Shortest Unsorted Continuous Subarray(Java实现)
这是悦乐书的第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实现)的更多相关文章
- LeetCode算法题-Shortest Completing Word(Java实现)
		
这是悦乐书的第309次更新,第330篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第178题(顺位题号是748).从给定的字典单词中查找最小长度单词,其中包含字符串lic ...
 - 【LeetCode】581. Shortest Unsorted Continuous Subarray 解题报告(Python & C++)
		
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 方法一:排序比较 日期 题目地址:https://leetco ...
 - 【leetcode】581. Shortest Unsorted Continuous Subarray
		
题目如下: 解题思路:本题我采用的是最简单最直接最粗暴的方法,把排序后的nums数组和原始数组比较即可得到答案. 代码如下: /** * @param {number[]} nums * @retur ...
 - LeetCode 581. 最短无序连续子数组(Shortest Unsorted Continuous Subarray)
		
581. 最短无序连续子数组 581. Shortest Unsorted Continuous Subarray 题目描述 给定一个整型数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序 ...
 - 【leetcode_easy】581. Shortest Unsorted Continuous Subarray
		
problem 581. Shortest Unsorted Continuous Subarray 题意:感觉题意理解的不是非常明白. solution1: 使用一个辅助数组,新建一个跟原数组一模一 ...
 - LeetCode算法题-Shortest Distance to a Character(Java实现)
		
这是悦乐书的第321次更新,第343篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第191题(顺位题号是821).给定字符串S和字符C,返回一个整数数组,表示字符串中所有 ...
 - LeetCode算法题-Path Sum III(Java实现)
		
这是悦乐书的第227次更新 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第94题(顺位题号是437).您将获得一个二叉树,其中每个节点都包含一个整数值.找到与给定值相加的路径数 ...
 - LeetCode算法题-Subdomain Visit Count(Java实现)
		
这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...
 - LeetCode算法题-Letter Case Permutation(Java实现)
		
这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另 ...
 
随机推荐
- 搭建自己的hexo博客
			
这是我最近用hexo搭建的个人博客,欢迎来参观留言,以下是我创建这个hexo的一步步步骤,欢迎指正! 我的博客 参考自 潘柏信的博客;CnFeat 主题参考这里 pacman; 主题选自这里 hexa ...
 - 『Two 树的直径求解及其运用』
			
树的直径 我们先来认识一下树的直径. 树是连通无环图,树上任意两点之间的路径是唯一的.定义树上任意两点\(u, v\)的距离为\(u\)到\(v\)路径上边权的和.树的直径\(MN\)为树上最长路径, ...
 - RBAC用户特别授权的思考
			
场景: 标准的RBAC,授权只应该赋予角色,再把角色指派给用户,当需要对特定用户授予权限时,就只能新建一个角色指派给这个用户.这就意味着每对一个新用户做特别授权都要创建一个特别角色. 今天脑洞大开,想 ...
 - MyEclipse  新手使用教程---图文详解
			
引言 某天在群里看到有小伙伴问MyEclipse/Eclipse的一些使用问题,虽然在我看来,问的问题很简单,但是如果对于刚刚学习的人来说,可能使用就不那么友好了.毕竟我在开始使用MyEclipse/ ...
 - leetcode — binary-tree-level-order-traversal
			
import org.lep.leetcode.binarytreeinordertraversal.BinaryTreeInOrderTraversal; import java.util.Arra ...
 - ldap配置系列二:jenkins集成ldap
			
ldap配置系列二:jenkins集成ldap jenkins简介 jenkins是一个独立的.开放源码的自动化服务器,它可以用于自动化与构建.测试.交付或部署软件相关的各种任务. jenkins官方 ...
 - LEMP平台全编译搭建
			
1.安装nginx1.13 1.1解决依赖关系 编译安装nginx需要事先需要安装开发包组"Development Tools"和 "Development Librar ...
 - JDBC事务与保存点  JDBC简介(七)
			
事务简介 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 事务是必须满足4个条件(ACID) 事务的原子性( A ...
 - MySQLSource-Flume
			
1. 自定义Source说明 实时监控MySQL,从MySQL中获取数据传输到HDFS或者其他存储框架,所以此时需要我们自己实现MySQLSource. 2. 自定义MySQLSource步骤 根据官 ...
 - IOS中armv7,armv7s,arm64以及i386和x86_64讲解
			
一.前言问题 在iOS 开发过程中,估计比较少的人会在意armv7,armv7s,arm64这些概念,如果在意可能也是项目中出现了像下面的问题,才会想起来解决这些问题,但还是不是特别的理解,这些概念, ...