581 最短無序連續子陣列

2022-08-11 23:15:28 字數 1386 閱讀 4531

題目描述:

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

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

示例 1:

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

輸出: 5

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

說明 :

輸入的陣列長度範圍在 [1, 10,000]。

輸入的陣列可能包含重複元素 ,所以公升序的意思是<=。

思想1:

將陣列nums 進行排序,記為 sort_nums。然後我們比較 nums 和 sort_nums的元素來決定最左邊和最右邊不匹配的元素。它們之間的子陣列就是要求的最短無序子陣列。

**1:

class

solution

}return (end-start>0)?end-start+1:0

; }

};

時間複雜度: o(nlogn)   (排序需要nlogn)

空間複雜度:o(n)

思想2:

這個演算法背後的思想是無序子陣列中最小元素的正確位置可以決定左邊界,最大元素的正確位置可以決定右邊界。

因此,首先我們需要找到原陣列在哪個位置開始不是公升序的。我們從頭開始遍歷陣列,一旦遇到降序的元素,我們記錄最小元素為 minmin 。

類似的,我們逆序掃瞄陣列 numsnums,當陣列出現公升序的時候,我們記錄最大元素為 maxmax。

然後,我們再次遍歷 numsnums 陣列並通過與其他元素進行比較,來找到 minmin 和 maxmax 在原陣列中的正確位置。我們只需要從頭開始找到第乙個大於 minmin 的元素,從尾開始找到第乙個小於 maxmax 的元素,它們之間就是最短無序子陣列。

我們可以再次使用下圖作為說明:

; //注意這個判斷條件,與上面兩個迴圈有關}};

581 最短無序連續子陣列

給定乙個整數陣列,你需要尋找乙個連續的子陣列,如果對這個子陣列進行公升序排序,那麼整個陣列都會變為公升序排序。你找到的子陣列應是最短的,請輸出它的長度。複製陣列,對該陣列排序,然後和原陣列相比較,得到兩頭第乙個不一樣元素的位置,這個區間的長度即為返回值。這種方式的負責度是 o 排序的複雜度 o n ...

581 最短無序連續子陣列

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

581 最短無序連續子陣列

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