leetcode (Shortest Unsorted Continuous Subarray)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hsx1612727380/article/details/84570416

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;
    }

猜你喜欢

转载自blog.csdn.net/hsx1612727380/article/details/84570416