刷題-力扣-581. 最短無序連續子陣列
阿新 • • 發佈:2021-08-04
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) 的解決方案嗎?
題目分析
- 根據題目描述,排序陣列中最小子陣列讓整個陣列變成非遞減序列,求最小子陣列的長度
- 排序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; } };