Leetcode 581. 最短無序連續子陣列 中等 陣列
阿新 • • 發佈:2022-05-05
581. 最短無序連續子陣列
題目:
給你一個整數陣列 nums ,你需要找出一個 連續子陣列 ,如果對這個子陣列進行升序排序,那麼整個陣列都會變為升序排序。
請你找出符合題意的 最短 子陣列,並輸出它的長度。
示例 1:
輸入:nums = [2,6,4,8,10,9,15]
輸出:5
解釋:你只需要對 [6, 4, 8, 10, 9] 進行升序排序,那麼整個表都會變為升序排序。
思路:
求中間亂序的連續子陣列長度。對於子陣列排序後,整個陣列就為有序陣列。
也就是分為A、B、C三段,A為有序陣列,C為有序陣列,B為無序。
那麼A中的num<=B C
C中的元素均大於B
所以我們從左到右,記錄最大值,當最大值<num[i]時,記錄B的右邊界為i
從右到左,記錄最小值,當最小值>num[n-i-1]時,記錄B的左邊界為n-i-1
class Solution { public: int findUnsortedSubarray(vector<int>& nums) { int maxn=INT_MIN; int minn=INT_MAX; int right=-1; int left=-1; int n=nums.size(); for(int i=0;i<nums.size();++i){// 從左向右,逐個遍歷 // 如果之前的最大值大於當前值,做標記i為B段的右端點 // 否則,更新最大值 if(maxn>nums[i]){ right=i; }else{ maxn=nums[i]; } // 從右向左 // 如果B段的最小值小於當前值,標記n-i-1為B段的左端點 // 否則,更新最小值 if(minn<nums[n-i-1]){ left=n-i-1; }else{ minn=nums[n-i-1]; } } return right==-1?0:(right-left+1); } };