LeetCode 581. 最短无序连续子数组(排序单调栈)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 581. 最短无序连续子数组(排序单调栈)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 題目
- 2. 解題
- 2.1 排序
- 2.2 4次遍歷
- 2.3 單調棧
1. 題目
給定一個整數數組,你需要尋找一個連續的子數組,如果對這個子數組進行升序排序,那么整個數組都會變為升序排序。
你找到的子數組應是最短的,請輸出它的長度。
示例 1: 輸入: [2, 6, 4, 8, 10, 9, 15] 輸出: 5 解釋: 你只需要對 [6, 4, 8, 10, 9] 進行升序排序,那么整個表都會變為升序排序。 說明 : 輸入的數組長度范圍在 [1, 10,000]。 輸入的數組可能包含重復元素 ,所以升序的意思是<=。來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/shortest-unsorted-continuous-subarray
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
- 從前后分別遍歷,碰到第一個拐點,開始找后面的最小值,和前面的最大值
- 將最大,最小值,插入到原數組中的位置,即形成了答案的最小區間
2.1 排序
- 排序后,不相等的最大區間就是需要排序的
2.2 4次遍歷
- 4次遍歷
2.3 單調棧
class Solution { public:int findUnsortedSubarray(vector<int>& nums) {int i, l = nums.size()-1, r = 0, idx;stack<int> stk;//存放下標for(i = 0; i < nums.size(); ++i){if(stk.empty() || nums[i] >= nums[stk.top()])stk.push(i);else{while(!stk.empty() && nums[stk.top()] > nums[i]){idx = stk.top();stk.pop();}l = min(l,idx);//每一個拐點后的數能頂到的最左端(有多小)}}while(!stk.empty())stk.pop();//清空for(i = nums.size()-1; i >= 0; --i){if(stk.empty() || nums[i] <= nums[stk.top()])stk.push(i);else{while(!stk.empty() && nums[stk.top()] < nums[i]){idx = stk.top();stk.pop();}r = max(r,idx);//每一個拐點后的數能頂到的最右端(有多大)}}if(r>l)return r-l+1;return 0;} };總結
以上是生活随笔為你收集整理的LeetCode 581. 最短无序连续子数组(排序单调栈)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 310. 最小高度树(
- 下一篇: 程序员面试金典 - 面试题 05.04.