135、最短無序連續子陣列
阿新 • • 發佈:2018-12-31
題目描述
給定一個整數陣列,你需要尋找一個連續的子陣列,如果對這個子陣列進行升序排序,那麼整個陣列都會變為升序排序。
你找到的子陣列應是最短的,請輸出它的長度。
示例 1:
輸入: [2, 6, 4, 8, 10, 9, 15]
輸出: 5
解釋: 你只需要對 [6, 4, 8, 10, 9] 進行升序排序,那麼整個表都會變為升序排序。
首先複製一個和nums一樣的陣列,這裡複製不能直接用等於號,因為這樣複製的話地址也是一樣,也就是說nums2排序那麼nums也會排序,然後進行對比,直接上程式碼
class Solution { public int findUnsortedSubarray(int[] nums) { int nums2[] = Arrays.copyOf(nums, nums.length); //對複製的nums2進行排序 Arrays.sort(nums2); int start = 0; int end = nums.length -1; for (int i = 0; i < nums2.length -1; i++) { if(nums[i] == nums2[i]){ start ++; }else { break; } } for (int i = nums2.length -1 ; i >=0; i--) { if(nums[i] == nums2[i]){ end --; if(end<=start ){ return 0; } }else { break; } } return end - start +1; } }
排名靠前的程式碼,思路差點不其實
class Solution { public int findUnsortedSubarray(int[] nums) { int left = 0, cur = 0; while (cur < nums.length - 1) { if (nums[cur] <= nums[cur + 1]) { cur++; left = cur; } else { break; } } if (cur == nums.length - 1) { return 0; } while (cur < nums.length) { while (left > -1 && nums[left] > nums[cur]) { left--; } cur++; } int right = nums.length - 1; cur = right; while (cur > 1) { if (nums[cur] >= nums[cur - 1]) { cur--; right = cur; } else { break; } } if (right == 0) { return 0; } while (cur > -1) { while (right < nums.length && nums[right] < nums[cur]) { right++; } cur--; } return right - left - 1; } }