leetcode (Shortest Unsorted Continuous Subarray)
阿新 • • 發佈:2018-12-01
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; }