1. 程式人生 > >第二章 排序 || 第19節 最短子數組練習題

第二章 排序 || 第19節 最短子數組練習題

-- 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節 最短子數組練習題