給定乙個整數陣列,你需要尋找乙個連續的子陣列,如果對這個子陣列進行公升序排序,那麼整個陣列都會變為公升序排序。
你找到的子陣列應是最短的,請輸出它的長度。
輸入: [2, 6, 4, 8, 10, 9, 15]方法一:排序演算法輸出: 5
解釋: 你只需要對 [6, 4, 8, 10, 9] 進行公升序排序,那麼整個表都會變為公升序排序。
這個方法就是將原有陣列拷貝為乙個新的陣列
然後去比較這兩個陣列最左邊和最右邊不匹配的元素
class
solution
}return end - start >
0? end - start +1:
0;}}
關鍵是,乙個地方不同肯定另乙個地方不同,有始有終
方法二:根據插入排序思想進行遍歷(leetcode 官方解答)
我們遍歷 numsnums 陣列中的每乙個元素 nums[i]nums[i] 。對於每乙個元素,我們嘗試找到它在正確順序陣列中的位置,即將它與每乙個滿足 i < j < ni如果存在 nums[j]nums[j] 比 nums[i]nums[i] 小,這意味著 nums[i]nums[i] 和 nums[j]nums[j] 都不在排序後陣列中的正確位置。因此我們需要交換這兩個元素使它們到正確的位置上。但這裡我們並不需要真的交換兩個元素,我們只需要標記兩個元素在原陣列中的位置 ii 和 jj 。這兩個元素標記著目前無序陣列的邊界。
因此,在所有的 nums[i]nums[i] 中,我們找到最左邊不在正確位置的 nums[i]nums[i] ,這標記了最短無序子陣列的左邊界(ll)。類似的,我們找到最右邊不在正確位置的邊界 nums[j]nums[j] ,它標記了最短無序子陣列的右邊界 (rr) 。
class
solution}}
return end - start >
0? end - start +1:
0;}}
方法三:使用棧
棧放的是陣列下標
遍歷陣列,如果是不斷公升序,我們就把下標入棧
一旦遇到後面(遍歷)的數字比前面的數字小,也就是nums[j] < 棧頂元素
為了找到 nums[j] 的正確位置,我們不斷將棧頂元素彈出,直到棧頂元素比 nums[j] 小,我們假設棧頂元素對應的下標為 k ,那麼我們知道 nums[j] 的正確位置下標應該是 k + 1
我們重複這一過程並遍歷完整個陣列,這樣我們可以找到最小的 k, 它也是無序子陣列的左邊界。
逆序遍歷一遍 nums 陣列來找到無序子陣列的右邊界。這一次我們將降序的元素壓入棧中,如果遇到乙個公升序的元素,我們像上面所述的方法一樣不斷將棧頂元素彈出,直到找到乙個更大的元素,以此找到無序子陣列的右邊界。
class
solution
stack.
push
(i);
} stack.
clear()
;for
(int i = nums.length -
1; i >=
0; i--
) stack.
push
(i);
}return end - start >
0? end - start +1:
0;}}
最短無序連續子陣列
題目描述 給定乙個整數陣列,你需要尋找乙個連續的子陣列,如果對這個子陣列進行公升序排序,那麼整個陣列都會變為公升序排序。你找到的子陣列應是最短的。示例 1 輸入 2,6,4,8,10,9,15 輸出 5 解釋 你只需要對 6,4,8,10,9 進行公升序排序,那麼整個表都會變為公升序排序。說明 輸入...
最短無序連續子陣列
最短無序連續子陣列 給定乙個整數陣列,你需要尋找乙個連續的子陣列,如果對這個子陣列進行公升序排序,那麼整個陣列都會變為公升序排序。你找到的子陣列應是最短的,請輸出它的長度。示例 1 輸入 2,6,4,8,10,9,15 輸出 5解釋 你只需要對 6,4,8,10,9 進行公升序排序,那麼整個表都會變...
最短無序連續子陣列
給定乙個整數陣列,你需要尋找乙個連續的子陣列,如果對這個子陣列進行公升序排序,那麼整個陣列都會變為公升序排序。你找到的子陣列應是最短的,請輸出它的長度。示例 1 輸入 2,6,4,8,10,9,15 輸出 5 解釋 你只需要對 6,4,8,10,9 進行公升序排序,那麼整個表都會變為公升序排序。說明...