Leetcode刷題 581 最短無連續子陣列

2021-10-07 12:40:33 字數 1021 閱讀 9865

給定乙個整數陣列,你需要尋找乙個連續的子陣列,如果對這個子陣列進行公升序排序,那麼整個陣列都會變為公升序排序。

你找到的子陣列應是最短的,請輸出它的長度。

示例:輸入: [2, 6, 4, 8, 10, 9, 15]

輸出: 5

解釋: 你只需要對 [6, 4, 8, 10, 9] 進行公升序排序,那麼整個表都會變為公升序排序。

這個方法背後的想法仍然是選擇排序。我們需要找到無序子陣列中最小元素和最大元素分別對應的正確位置,來求得我們想要的無序子陣列的邊界。

為了達到這一目的,此方法中,我們使用 棧 。我們從頭遍歷 nums陣列,如果遇到的數字大小一直是公升序的,我們就不斷把對應的下標壓入棧中,這麼做的目的是因為這些元素在目前都是處於正確的位置上。一旦我們遇到前面的數比後面的數大,也就是 nums[j] 比棧頂元素小,我們可以知道 nums[j] 一定不在正確的位置上。

為了找到 nums[j] 的正確位置,我們不斷將棧頂元素彈出,直到棧頂元素比 nums[j] 小,我們假設棧頂元素對應的下標為 k ,那麼我們知道 nums[j] 的正確位置下標應該是 k+1 。

我們重複這一過程並遍歷完整個陣列,這樣我們可以找到最小的 k, 它也是無序子陣列的左邊界

類似的,我們逆序遍歷一遍 numsnums 陣列來找到無序子陣列的右邊界。這一次我們將降序的元素壓入棧中,如果遇到乙個公升序的元素,我們像上面所述的方法一樣不斷將棧頂元素彈出,直到找到乙個更大的元素,以此找到無序子陣列的右邊界。

public

class

solution

stack.

clear()

;for

(int i = nums.length -

1; i >=

0; i--

)return r - l >

0? r - l +1:

0;}}

leetCode 第581題 最短無序連續子陣列

題目 給定乙個整數陣列,你需要尋找乙個連續的子陣列,如果對這個子陣列進行公升序排序,那麼整個陣列都會變為公升序排序。你找到的子陣列應是最短的,請輸出它的長度。示例 1 輸入 2,6,4,8,10,9,15 輸出 5 解釋 你只需要對 6,4,8,10,9 進行公升序排序,那麼整個表都會變為公升序排序...

leetcode 581 最短無序連續子陣列

給定乙個整數陣列,你需要尋找乙個連續的子陣列,如果對這個子陣列進行公升序排序,那麼整個陣列都會變為公升序排序。你找到的子陣列應是最短的,請輸出它的長度。示例 1 輸入 2,6,4,8,10,9,15 輸出 5 解釋 你只需要對 6,4,8,10,9 進行公升序排序,那麼整個表都會變為公升序排序。說明...

leetcode 581 最短無序連續子陣列

給定乙個整數陣列,你需要尋找乙個連續的子陣列,如果對這個子陣列進行公升序排序,那麼整個陣列都會變為公升序排序。你找到的子陣列應是最短的,請輸出它的長度。示例 1 輸入 2,6,4,8,10,9,15 輸出 5 解釋 你只需要對 6,4,8,10,9 進行公升序排序,那麼整個表都會變為公升序排序。說明...