1. 程式人生 > >leetcode (Shortest Unsorted Continuous Subarray)

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