第二章 排序 || 第19節 最短子數組練習題
阿新 • • 發佈:2018-07-09
-- d+ return code 用例 max 最短 試用 sts
題目
對於一個數組,請設計一個高效算法計算需要排序的最短子數組的長度。
給定一個int數組A和數組的大小n,請返回一個二元組,代表所求序列的長度。(原序列位置從0開始標號,若原序列有序,返回0)。保證A中元素均為正整數。
測試樣例:
[1,4,6,5,9,10],6
返回:2
解析
- C++版
class Subsequence { public: int shortestSubsequence(vector<int> A, int n) { // write code here int start=0; int end=n-1; //最右邊比max值小的數的下標 //最左邊比min大的數的下標 //測試用例:[1,2,10,1,8,9],6 int max=A[0],min=A[n-1];//記錄兩邊已經遍歷過的極值 for(int i=0;i<n;i++) if(A[i]<max) start=i; else max=(max>A[i])?max:A[i]; for(int j=n-1;j>=0;j--) if(A[j]>min) end=j; else min=(min<A[j])?min:A[j]; if(start<=end) return 0; else return start-end+1; } };
- 錯誤的思想:直接從左右兩邊逆序記錄位置不對,需要找到全局極值
class Subsequence { public: int shortestSubsequence(vector<int> A, int n) { // write code here int start=0; int end=n-1; for(int i=0;i<n-1;i++) if(A[i]>A[i+1]) { start=i; break; } if(start==0&&A[n-2]<=A[n-1]) return 0; for(int j=n-1;j>=start;j--) { if(A[j]<A[j-1]) { end=j; break; } } int res=end-start+1; return res; } }; 測試用例: [1,2,10,1,8,9],6 對應輸出應該為: 5 你的輸出為: 2
第二章 排序 || 第19節 最短子數組練習題