题目
给你一个数组 target
和一个整数 n。每次迭代,需要从 list = { 1 , 2 , 3 …, n }
中依次读取一个数字。
请使用下述操作来构建目标数组 target :
"Push":从 list 中读取一个新元素, 并将其推入数组中。
"Pop":删除数组中的最后一个元素。
如果目标数组构建完成,就停止读取更多元素。
题目数据保证目标数组严格递增,并且只包含 1 到 n 之间的数字。
请返回构建目标数组所用的操作序列。如果存在多个可行方案,返回任一即可。
解题思路:
- 第一种:
- 同时遍历
target
和n
,当前的target[p] === i
时,直接往结果数组中push一个 “Push” 即可 - 如果当前的
target[p] > i
时,则需要连续的往结果数组中pushtarget[p] - i
个 “Push” 和 “Pop” - 这种做法,多写了一层循环,增加了时间复杂度,变为O(n^2))
- 同时遍历
- 第二种:
- 也是同时遍历
target
和n
,不过当target[p] !== i
时,往结果数组中push 一个 “Push” 和 “Pop” 即可。这种只需要一次循环,时间复杂度变为了O(n)。
- 也是同时遍历
/**
* @param {number[]} target
* @param {number} n
* @return {string[]}
*/
var buildArray = function(target, n) {
let res = [];
for(let i = 1,p=0;i<=n,p<target.length;i++){
if(target[p] === i){
res.push("Push")
p++;
}else{
res.push("Push")
res.push("Pop")
}
}
/*let p = 0,i=1;
while(i<=n && p<target.length){
if(target[p] === i){
res.push("Push");
p++;
i++;
}
else if(target[p] > i){
for(let j=0;j<target[p]-i;j++) {
res.push("Push")
res.push("Pop")
}
i = target[p];
}
}*/
return res;
};
总结:做题时还是需要多思考,尽量择优。但是,没有思路的时候,有解才是最重要的。