LeetCode 1141. 用栈操作构建数组

题目
给你一个数组 target 和一个整数 n。每次迭代,需要从 list = { 1 , 2 , 3 …, n } 中依次读取一个数字。

请使用下述操作来构建目标数组 target :

"Push":从 list 中读取一个新元素, 并将其推入数组中。
"Pop":删除数组中的最后一个元素。
如果目标数组构建完成,就停止读取更多元素。
题目数据保证目标数组严格递增,并且只包含 1 到 n 之间的数字。

请返回构建目标数组所用的操作序列。如果存在多个可行方案,返回任一即可。

解题思路

  • 第一种:
    • 同时遍历 targetn,当前的 target[p] === i 时,直接往结果数组中push一个 “Push” 即可
    • 如果当前的 target[p] > i 时,则需要连续的往结果数组中push target[p] - i 个 “Push” 和 “Pop”
    • 这种做法,多写了一层循环,增加了时间复杂度,变为O(n^2))
  • 第二种:
    • 也是同时遍历 targetn,不过当 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;
};

总结:做题时还是需要多思考,尽量择优。但是,没有思路的时候,有解才是最重要的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值