leetcode (Shortest Unsorted Continuous Subarray)

Title:Shortest Unsorted Continuous Subarray    581

Difficulty:Easy

原题leetcode地址:https://leetcode.com/problems/shortest-unsorted-continuous-subarray/

 

1. 复制nums数组,然后排序,进行对比。

时间复杂度:O(n)。

空间复杂度:O(n),申请的最长空间长度为n。

    /**
     * 申请一个鱼nums长度大小一样的数组tmp,将nums中的数据复制过来,之后对tmp排序
     *  从头对比tmp与nums的大小,不同则将下标记录下来
     *  从尾对比tmp与nums的大小,不同则将下标记录下来
     *  最后将上述的两个下标向减加1
     * @param nums
     * @return
     */
    public static int findUnsortedSubarray(int[] nums) {

        if (nums == null || nums.length <= 1) {
            return 0;
        }

        int tmp[] = new int[nums.length];

        for (int i = 0; i < nums.length; i++) {
            tmp[i] = nums[i];
        }
        Arrays.sort(tmp);

        int begin = -1;
        int end = -2;  // 这里的end必须比begin小1,解决{1, 2, 3, 4}这样的已经排序OK的
        for (int i = 0; i < nums.length; i++) {
            if (tmp[i] != nums[i]) {
                begin = i;
                break;
            }
        }
        for (int i = nums.length - 1; i >= 0; i--) {
            if (tmp[i] != nums[i]) {
                end = i;
                break;
            }
        }

        return end - begin + 1;

    }

2. 从左到右遍历,设置最大值,如果后面数依次都小于这个最大值,则记住依次遍历到的nums的下标,这个记录的比较大的下标,从右到左遍历,设置最小值,如果后面数依次都大于这个最小值,则记住依次遍历到的nums的下标,这个记录的比较小的下标

时间复杂度:O(n)。

空间复杂度:O(1)。

    /**
     * 从左到右遍历,设置最大值,如果后面数依次都小于这个最大值,则记住依次遍历到的nums的下标,这个记录的比较大的下标
     * 从右到左遍历,设置最小值,如果后面数依次都大于这个最小值,则记住依次遍历到的nums的下标,这个记录的比较小的下标
     * @param nums
     * @return
     */
    public static int findUnsortedSubarray1(int[] nums) {

        if (nums == null || nums.length <= 1) {
            return 0;
        }

        int begin = -1;
        int end = -2;
        int max = nums[0];
        int min = nums[nums.length - 1];

        for (int i = 0; i < nums.length; i++) {
            max = max > nums[i]? max : nums[i];
            if (max > nums[i]) {
                end = i;
            }
            min = min < nums[nums.length - i - 1]? min : nums[nums.length - i - 1];
            if (min < nums[nums.length - i - 1]) {
                begin = nums.length - i - 1;
            }
        }

        return end - begin + 1;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鬼王呵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值