classSolution{publicintfindUnsortedSubarray(int[] nums){int len = nums.length;int[] copyArray =Arrays.copyOf(nums, len);// 時間復雜度 O(nlogn)Arrays.sort(copyArray);int left =0;for(; left < len; left++){if(nums[left]!= copyArray[left]){break;}}int right = len -1;for(; right >= left; right--){if(nums[right]!= copyArray[right]){break;}}return right - left +1;}}
2. 記錄 max[ ]、min[ ] 的寫法 O(n)、O(n)
這個思路是,之前寫的接雨水,用到的思路,這里剛好套用下。
min[i]:記錄 i 右邊的最小元素。如果 i 比這個元素大,說明 i 需要重排。
max[i]:記錄 i 左邊的最大元素。如果 i 比這個元素小,說明 i 需要重排。 (實際代碼復用 min數組)
classSolution{publicintfindUnsortedSubarray(int[] nums){int len = nums.length;int[] min =newint[len];// 1. 先找 left// 尾元素右邊沒有值,直接設為自己min[len -1]= nums[len -1];for(int i = len -2; i >=0; i--){min[i]=Math.min(nums[i +1], min[i +1]);}int left = len -1;for(int i =0; i < len; i++){if(min[i]< nums[i]){left = i;break;}}if(left == len -1){return0;}// 2. 再找 right;min[0]= nums[0];for(int i =1; i < len; i++){min[i]=Math.max(nums[i -1], min[i -1]);}int right =0;for(int i = len -1; i >=0; i--){if(min[i]> nums[i]){right = i;break;}}return right - left +1;}}
3. 記錄 max、min 的寫法 O(n)、O(1)
算是方法2的優化吧,空間復雜度只有 O(1)
總體思路一樣,這里是沒有 break 的
max:記錄 i 左邊的最大元素,如果 i 更小,說明 i 需要調整
min:記錄 i 右邊的最大元素,如果 i 更大,說明 i 需要調整
classSolution{publicintfindUnsortedSubarray(int[] nums){int len = nums.length;if(len <=1){return0;}// 1. 從左往右,記錄最大值。如果 nums[i] < max,說明 i 需要調整int left =-1;int max = nums[0];for(int i =1; i < len; i++){max =Math.max(max, nums[i]);if(nums[i]< max){left = i;}}// 2. 從右往左,記錄最小值,同理int right =0;int min = nums[len -1];for(int i = len -2; i >=0; i--){min =Math.min(min, nums[i]);if(nums[i]> min){right = i;}}// left == -1 則說明整體有序,不用排序return left ==-1?0: left - right +1;}}
二刷
接雨水的思路= =,都快忘了已經
classSolution{publicintfindUnsortedSubarray(int[] nums){// 從左往右,記錄最大值,不斷調整。max 記錄左邊的最大值int max = nums[0];int right =-1;for(int i =1; i < nums.length; i++){max =Math.max(max, nums[i]);// 此時的 nums[i] 比左邊的最大值小,德不配位!先保留著(后面可能還有更德不配位的)if(nums[i]< max){right = i;}}// 找 left,同理int min = nums[nums.length -1];int left = nums.length;for(int i = nums.length -1; i >=0; i--){min =Math.min(min, nums[i]);if(nums[i]> min){left = i;}}return right ==-1?0: right - left +1;}}