算法-array-5-581. Shortest Unsorted Continuous Subarray

本文介绍了一种寻找最短无序连续子数组的方法,通过对数组进行排序并对比原始数组来找出需要排序的最短子数组长度。此外,还提供了一种更高效的解决方案,避免了直接对整个数组进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package leet.array;

import java.util.Arrays;

public class ShortestUnsortedContinuousSubarray581 {
    //题目要求:
    /*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.

    Example 1:

    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:

    1.Then length of the input array is in range [1, 10,000].
    2.The input array may contain duplicates, so ascending order here means <=. 
*/
    ////////////-------------------------------///
    //【思路】
    /*1.对array进行排序,对比排序前部和后部,然后计算出结果。*/
        public int findUnsortedSubarray(int[] nums) {
            int count = nums.length;
            int[] a = nums.clone();
            //int[] a = nums;//【注意】复制这样a和nums是同一个数组
            //System.out.println(a==nums);//【注意】调试性语句,输出这两个数组是否是同一个数组。
            Arrays.sort(a);
            for (int i = 0; i < nums.length; i++) {
                if (a[i]==nums[i]) {
                    count--;
                }else {
                    break;
                }
            }
            //【细节】考虑如果输入的数组是有序的情况。所以要加入这句话语。
            if(count==0){
                return count;
            }
            for (int i = a.length-1; i > 0; i--) {
                if (a[i]==nums[i]) {
                    count--;
                }else {
                    break;
                }
            }
            return count ;
        }
        public static void main(String[] args){
            ShortestUnsortedContinuousSubarray581 nContinuousSubarray581 = new ShortestUnsortedContinuousSubarray581();
            int[] nums = {2, 6, 4, 8, 10, 9, 15};
            int n = nContinuousSubarray581.findUnsortedSubarray(nums);
            System.out.println(n);
        }
    //【反思:】如果光看别人写,总感觉别人考虑周全,代码功力很牛。殊不知,其实都是思想转换为代码,一步一步加以成功的。
        //所以编程这种东西,是要靠自己动手,自己思考,自己编写代码,自己调试调出来的。没有其他更好的学习方式。
        //这也是最好,最快的学习方式。所以以后学到什么,都迫不及待的动手试试,是最好的。
        //这种代码让别人看,别人也觉得你很牛,其实都是一步一步写过来的,不是天生就会。
}

排序过程耗费时间,不采用排序
第二种方式:(找到有序位置的两个角标进行比较)
//

public int findUnsortedSubarray2(int[] A) {
            int n = A.length, beg = -1, end = -2, min = A[n-1], max = A[0];
            for (int i=1;i<n;i++) {
              if (max > A[i]) {
                max = A[i];
              }else {
                end=i;
              }

              if (min < A[n-1-i]) {
                min = A[n-1-i];
              }else {
                beg = n-1-i;
              }
            }
            return end - beg + 1;
        }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值