1441 用棧操作構建陣列

王培琳發表於2020-10-02

題目描述:
給你一個目標陣列 target 和一個整數 n。每次迭代,需要從 list = {1,2,3…, n} 中依序讀取一個數字。
請使用下述操作來構建目標陣列 target :
Push:從 list 中讀取一個新元素, 並將其推入陣列中。
Pop:刪除陣列中的最後一個元素。
如果目標陣列構建完成,就停止讀取更多元素。
題目資料保證目標陣列嚴格遞增,並且只包含 1 到 n 之間的數字。
請返回構建目標陣列所用的操作序列。
題目資料保證答案是唯一的。

示例 1:
輸入:target = [1,3], n = 3
輸出:[“Push”,“Push”,“Pop”,“Push”]
解釋:
讀取 1 並自動推入陣列 -> [1]
讀取 2 並自動推入陣列,然後刪除它 -> [1]
讀取 3 並自動推入陣列 -> [1,3]

示例 2:
輸入:target = [1,2,3], n = 3
輸出:[“Push”,“Push”,“Push”]

示例 3:
輸入:target = [1,2], n = 4
輸出:[“Push”,“Push”]
解釋:只需要讀取前 2 個數字就可以停止。

示例 4:
輸入:target = [2,3,4], n = 4
輸出:[“Push”,“Pop”,“Push”,“Push”,“Push”]

提示:
1 <= target.length <= 100
1 <= target[i] <= 100
1 <= n <= 100
target 是嚴格遞增的

方法1:
主要思路:
(1)模擬過程即可;
(2)從1到n,逐個數字壓入棧中,同時同步判斷目標陣列中的元素;
(3)若是是當前目標陣列中的元素,則只壓入,然後目標陣列索引後移,判斷下一個;
(4)若不是,則需要壓入和彈出兩個操作;

class Solution {
public:
    vector<string> buildArray(vector<int>& target, int n) {
        int pos=0;
        vector<string> res; //儲存結果
        for(int i=1;i<=n;++i){
            if(i==target[pos]){//若是當前元素
                res.push_back("Push");
                ++pos;
                if(pos==target.size()){//提前終止條件
                    break;
                }
            }
            else{//若不在目標陣列中
                res.push_back("Push");
                res.push_back("Pop");
            }
        }
        return res;
    }
};

相關文章