【LeetCode】581.最短无序连续子数组

题目

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

请你找出符合题意的 最短 子数组,并输出它的长度。

示例 1:

复制代码
输入:nums = [2,6,4,8,10,9,15]
输出:5
解释:你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。

示例 2:

复制代码
输入:nums = [1,2,3,4]
输出:0

示例 3:

复制代码
输入:nums = [1]
输出:0

提示:

  • 1 <= nums.length <= 10^4
  • -10^5 <= nums[i] <= 10^5

解答

源代码

java 复制代码
class Solution {
    public int findUnsortedSubarray(int[] nums) {
        if (isSorted(nums)) {
            return 0;
        }

        int[] numsSorted = new int[nums.length];
        System.arraycopy(nums, 0, numsSorted, 0, nums.length);
        Arrays.sort(numsSorted);

        int left = 0;
        while (nums[left] == numsSorted[left]) {
            left++;
        }

        int right = nums.length - 1;
        while (nums[right] == numsSorted[right]) {
            right--;
        }

        return right - left + 1;
    }

    public boolean isSorted(int[] nums) {
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] < nums[i - 1]) {
                return false;
            }
        }

        return true;
    }
}

总结

既然这个数组有一部分元素进行升序排序后整个数组都会变成升序排列,那么最后得到的升序排列数组和一开始的原数组相比,只有中间连续的一部分不同。那么我们将原数组复制一份,把复制得到的数组进行排序,然后对比元素得到不同部分的左右边界,以得到这个子数组的长度。

相关推荐
wuminyu13 小时前
Java锁机制之park与futex系统级协同机制解析
java·linux·c语言·jvm·c++
疯狂打码的少年13 小时前
编译程序与解释程序的区别
java·开发语言·笔记
小雨下雨的雨17 小时前
井字棋AI机器人实现详解 - Minimax算法实战-鸿蒙PC Electron框架完成
前端·人工智能·算法·华为·electron·鸿蒙
xieliyu.19 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
明夜之约20 小时前
Spring Boot 自动装配源码
java·spring boot·后端
Leaton Lee20 小时前
Spring Boot分层架构详解:从Controller到Service再到Mapper的完整流程
java·spring boot·后端·架构
Jinkxs20 小时前
Resilience4j- 与 Spring Boot 快速集成:自动配置与基础注解使用
java·spring boot·后端
辣机小司20 小时前
【踩坑记录:Spring Boot 配置文件读取值不一致?警惕 YAML 的“八进制陷阱”与 SnakeYAML 版本之谜】
java·spring boot·后端·yaml·踩坑记录
一条小锦吕*20 小时前
基于Spring Boot + 数据可视化 + 协同过滤算法的推荐系统设计与实现(源码+论文+部署全讲解)
spring boot·算法·信息可视化
fangdengfu12321 小时前
ES分析系统各个服务日志占用量
java·前端·elasticsearch