LeetCode 0581 -- 最短無序連續子數組

最短無序連續子數組

題目描述

給定一個整數數組,你需要尋找一個連續的子數組,如果對這個子數組進行升序排序,那麼整個數組都會變爲升序排序。

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

示例 1:

輸入: [2, 6, 4, 8, 10, 9, 15]
輸出: 5
解釋: 你只需要對 [6, 4, 8, 10, 9] 進行升序排序,那麼整個表都會變爲升序排序。

說明:

  1. 輸入的數組長度範圍在 [1, 10,000]。
  2. 輸入的數組可能包含重複元素 ,所以升序的意思是**<=。**

個人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;
    }
}

時間複雜度: O(n)O(n)

空間複雜度: O(1)O(1)

最優解

同上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章