算法小知识-----10.15----- 用栈操作构建数组

89 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情

用栈操作构建数组

该题出自力扣的1441题 —— 用栈操作构建数组【中等题】

审题

给你一个数组 target 和一个整数 n。每次迭代,需要从  list = { 1 , 2 , 3 ..., n } 中依次读取一个数字。 请使用下述操作来构建目标数组 target : "Push":从 list 中读取一个新元素, 并将其推入数组中。 "Pop":删除数组中的最后一个元素。 如果目标数组构建完成,就停止读取更多元素。 题目数据保证目标数组严格递增,并且只包含 1 到 n 之间的数字。 请返回构建目标数组所用的操作序列。如果存在多个可行方案,返回任一即可。

  • 这道题,虽然是中等题,但是,题意很简单,不难理解的
  • 就是给出一个整型数组,而且前提是该数组还是严格递增的,数组内包含1到n的数字,需要构建出这个数组所需要的操作,最后汇总成列表并返回即可。包含操作为,填充push,删除pop
  • 其中判断,如果当前数字不存在数组内,那么就要类似栈一样,先入栈再出栈,同理在这边也就是 先push,再pop
  • 解法:
    • 先构建出返回的结果列表
    • 循环遍历从1到n
    • 先判断剪枝,如果已经到达数组的长度了,那么就证明后面的就不需要了,退出循环
    • 无论是否需要弹栈都是要先进栈的
    • 判断是否存在数组内,不存在则使用pop操作弹出
    • 最后再数组下标加一
    • 凡是不在数组里的数字先push再pop,在数组的只需要push

编码

class Solution {
    public List<String> buildArray(int[] target, int n) {
        List<String> list = new ArrayList<>();
        int index = 0;
        for (int i = 1; i <= n; i++) {
if (index == target.length)break;
            list.add("Push");
            if (target[index] != i){
                list.add("Pop");
            }else {
                index++;
            }
        }
        return list;
    }
}

image.png