题目描述
这是 力扣上的 1441. 用栈操作构建数组,难度为 中等。
题目分析
根据题意咱们需要去用栈的方式来处理这个题,题目给出的 target 是我们需要模拟的结果,给出的 n 实际上是对应这一个 1-n 的列表,并且此处说明 target 一定是单调递增的
因此,咱们来实现这个题,仅需要按照题目来进行模拟即可
栈的思想是先进后出 FIFO,那么每个数字(来源于 1-n) 都需要遵循这个规定
那么我们就可以直接来来遍历我们的目标 target ,来根据 target 中遍历出来的每一个元素进行判断, 同时需要记录一下 1-n 的列表我们遍历到哪里了
遍历 target 的时候,我们判断当前元素,和 1-n 中的对应数字是否有偏差
- 如果没有偏差, 那么就直接将 1-n 中的这个数字进行 “Push” 即可,当然实际的操作是将 “Push” 字符串加入到结果集
- 如果是有偏差的,那么说明是 target 中的当前元素(例如记为 A)是大于 1-n 列表中对应的元素(例如记为 B),那么就要将 B 到 A 中的每一个数字进行 “Push“ 再 “Pop” 放到结果集中 , 最终直到 A == B ,此时再将 B “Push” 到结果集中
经过模拟之后,咱们得到的结果集,即为我们期望的操作栈的顺序
过程可以看如下简图:例如 target = [1,3], n = 3
相信通过这个简图,我们就可以知道上述阐述的 2 种情况了吧,一个是正常入栈,一个是先入栈再出栈,一定要注意本题,本题能实现的前提是,给出的 target 一定是单点递增的
如果用在实际工作生活中这是不可取的,因为不够健壮,实际工作中会有很多坑以及异常情况,都是要注意处理的,简单先说到这里
接下来,咱们就可以来实现编码了,咱们这次使用 golang 的方式来进行实现
Golang 的实现方式:
func buildArray(target []int, n int) []string { // 简单模拟 help := 0 ans := []string{} for _, num := range target { for i:=0; i<num-help-1;i++{ ans = append(ans, "Push", "Pop") } ans = append(ans, "Push") help = num } return ans }
这种实现方式,咱们的时间复杂度是 O(n),此处的 n 是 target 的长度,空间复杂度也是 O(n),那就是咱们的 ans
今天就到这里,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~