标签:solution 从后往前 bar 最大值 public turn lse span pre
1 static int wing=[]() 2 { 3 std::ios::sync_with_stdio(false); 4 cin.tie(NULL); 5 return 0; 6 }(); 7 8 class Solution 9 { 10 public: 11 int findUnsortedSubarray(vector<int>& nums) 12 { 13 int sz=nums.size(); 14 int beg=-1,end=-2,maxele=nums[0],minele=nums[sz-1]; 15 for(int i=1;i<sz;i++) 16 { 17 maxele=max(maxele,nums[i]); 18 minele=min(minele,nums[sz-1-i]); 19 if(nums[i]<maxele) end=i; 20 if(nums[sz-1-i]>minele) beg=sz-1-i; 21 } 22 return end-beg+1; 23 } 24 };
这个方法很骚,线性时间,解释一波
从前向后扫描,maxele存放从nums[0]到nums[i]之间的最大元素,和当前元素比较,若当前元素nums[i]小于这个最大值,则更新end
从后往前扫描,minele存放从nums[sz-1]到当前元素中的最小值,和当前于元素比较,若当前元素大于这个最小值,则更新beg
1 2 3 6 4 5 7 8 9
beg end
再说明一下就是,
只有前面的元素是排序后的最终元素时,beg才不会向前移动。如果不是最终位置,必然会有某个元素会大于minele,然后更新beg
只有后面的元素是排序后最终元素时,end才不会向后移动。如果不是最终位置,必然会有某个元素小于maxele,然后更新end
581. Shortest Unsorted Continuous Subarray
标签:solution 从后往前 bar 最大值 public turn lse span pre
原文地址:https://www.cnblogs.com/zhuangbijingdeboke/p/9141513.html