日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 581. 最短无序连续子数组(排序单调栈)

發(fā)布時間:2024/7/5 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 581. 最短无序连续子数组(排序单调栈) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題
      • 2.1 排序
      • 2.2 4次遍歷
      • 2.3 單調棧

1. 題目

給定一個整數數組,你需要尋找一個連續(xù)的子數組,如果對這個子數組進行升序排序,那么整個數組都會變?yōu)樯蚺判颉?/p>

你找到的子數組應是最短的,請輸出它的長度。

示例 1: 輸入: [2, 6, 4, 8, 10, 9, 15] 輸出: 5 解釋: 你只需要對 [6, 4, 8, 10, 9] 進行升序排序,那么整個表都會變?yōu)樯蚺判颉?說明 : 輸入的數組長度范圍在 [1, 10,000]。 輸入的數組可能包含重復元素 ,所以升序的意思是<=

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/shortest-unsorted-continuous-subarray
著作權歸領扣網絡所有。商業(yè)轉載請聯(lián)系官方授權,非商業(yè)轉載請注明出處。

2. 解題

  • 從前后分別遍歷,碰到第一個拐點,開始找后面的最小值,和前面的最大值
  • 將最大,最小值,插入到原數組中的位置,即形成了答案的最小區(qū)間

2.1 排序

  • 排序后,不相等的最大區(qū)間就是需要排序的
class Solution { public:int findUnsortedSubarray(vector<int>& nums) {vector<int> sorted(nums);sort(sorted.begin(), sorted.end());int i = nums.size()-1, j = 0;for(int k = 0; k < nums.size(); ++k){if(nums[k] != sorted[k]){i = min(i,k);j = max(j,k);}}if(j > i)return j-i+1;return 0;} };

2.2 4次遍歷

  • 4次遍歷
class Solution { public:int findUnsortedSubarray(vector<int>& nums) {if(nums.size() <= 1)return 0;int i, MIN = INT_MAX, MAX = INT_MIN;bool flag = false;for(i = 1; i < nums.size(); ++i){if(nums[i-1] > nums[i])flag = true;if(flag)MIN = min(MIN,nums[i]);//找拐點后面的最小值}flag = false;for(i = nums.size()-2; i >= 0; --i){if(nums[i] > nums[i+1])flag = true;if(flag)MAX = max(MAX,nums[i]);//找拐點前面的最大值}int l,r;for(l = 0; l < nums.size(); ++l)if(MIN < nums[l])//最小值插入位置break;for(r = nums.size()-1; r >= 0; --r)if(MAX > nums[r])//最大值插入的位置break;if(r > l)return r-l+1;return 0;} };

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. 最短无序连续子数组(排序单调栈)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。