每日力扣-用栈操作构建数组

60 阅读2分钟

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

每日力扣是一个专门用来讲力扣中国每天发布的每日一题的栏目。本专栏不提供题目的解答源码,只讲解思路,目的是养成每日刷题、提高自己手感,从而达到算法熟练的目标。

题目(已做删减处理)

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

分析

特别简单的一道算法那题目。首先我们操作的是从1到n的数组。而且是严格递增的。那么我们就可以这么进行思考:

  • 如果当前的数字在 target中,直接push即可;
  • 如果当前的数字不在 target 中,那么先push再 POP 即可。

按照上面的逻辑,我们可以发散一下思维:

  • 因为数组 严格单调递增的;
  • 假设当前数据now 和 之前的数据 pre,如果中间数据不在 target 中,我们需要执行的 push 和 pop操作,也就是 now-pre-1 个。这样思考起来更加方便。

总结

一道十分简单的算法题目。对于算法新人来说,是很好的练手题目。特别是对于刚进入力扣学习算法的徐盛来讲,虽然算法很简单,但是思考和优化的逻辑还是需要新人们仔细考虑后,才能够想到的。

这道题目力扣评估为中等难度。个人认为达到不中等难度题目的要求,最多是easy难度。如果是在周赛中,最多也就是第二道题目的难度。所以建议所有的算法学生都能够 AC 这道题目。

解题思路

image.png