1. 程式人生 > 其它 >刷題-力扣-581. 最短無序連續子陣列

刷題-力扣-581. 最短無序連續子陣列

581. 最短無序連續子陣列

題目連結

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/shortest-unsorted-continuous-subarray
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

題目描述

給你一個整數陣列 nums ,你需要找出一個 連續子陣列 ,如果對這個子陣列進行升序排序,那麼整個陣列都會變為升序排序。
請你找出符合題意的 最短 子陣列,並輸出它的長度。

示例 1:

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

示例 2:

輸入:nums = [1,2,3,4]
輸出:0

示例 3:

輸入:nums = [1]
輸出:0

提示:

  • 1 <= nums.length <= 104
  • -105 <= nums[i] <= 105

進階:你可以設計一個時間複雜度為 O(n) 的解決方案嗎?

題目分析

  1. 根據題目描述,排序陣列中最小子陣列讓整個陣列變成非遞減序列,求最小子陣列的長度
  2. 排序nums,再和原陣列比較變化的部分的長度

程式碼

class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {
        vector<int> sortNums(nums);
        sort(sortNums.begin(), sortNums.end());
        int numsLen = nums.size();
        int left = 0;
        int right = numsLen - 1;
        for (left; left < numsLen; ++left) {
            if (nums[left] != sortNums[left]) break;
        }
        for (right; right > left; --right) {
            if (nums[right] != sortNums[right]) break;
        }
        return right > left ? right - left + 1 : 0;
    }
};