最短無序連續子數組
題目描述
給定一個整數數組,你需要尋找一個連續的子數組,如果對這個子數組進行升序排序,那麼整個數組都會變爲升序排序。
你找到的子數組應是最短的,請輸出它的長度。
示例 1:
輸入: [2, 6, 4, 8, 10, 9, 15]
輸出: 5
解釋: 你只需要對 [6, 4, 8, 10, 9] 進行升序排序,那麼整個表都會變爲升序排序。
說明:
- 輸入的數組長度範圍在 [1, 10,000]。
- 輸入的數組可能包含重複元素 ,所以升序的意思是**<=。**
個人AC
class Solution {
public int findUnsortedSubarray(int[] nums) {
// start記錄連續子數組的開始下標,當nums[i] < nums[i-1]時爲start賦值
// m記錄數組中的最大值
// end記錄連續子數組的結束下標,當nums[i] < m時,更新end,並且看是否要更新start
int start = -1, end = -1, m = nums[0];
for (int i = 1; i < nums.length; i++) {
if (nums[i - 1] > nums[i] && start < 0) {
start = i - 1;
}
if (m > nums[i]) {
end = i;
while (start >= 1 && nums[start - 1] > nums[i]) start--;
} else {
m = nums[i];
}
}
// start < 0說明給定數組是升序的,無序子數組長度爲0
return start < 0 ? 0 : end - start + 1;
}
}
時間複雜度: ;
空間複雜度: 。
最優解
同上。