最短無序連續子陣列

2021-10-02 12:53:25 字數 1803 閱讀 8213

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

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

輸入: [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 進行公升序排序,那麼整個表都會變為公升序排序。說明...