1441. 用栈操作构建数组(双指针模拟)

155 阅读2分钟

image.jpeg

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

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目提示

    • 1 <= target.length <= 100
    • 1 <= n <= 100
    • 1 <= target[i] <= n
    • target 严格递增

二、思路分析:

我们今天拿到本题是 leetcode 难度为中等题 1441. 用栈操作构建数组。题目要求模拟栈来构建数组过程,并返回栈操作过程记录。题目中给出几个细节点:

  • target数组中的元素是递增关系
  • 迭代顺序是从1~n的列表中依次读取数字
  • 栈的操作:入栈(Push)和出栈(Pop)
  • 当构建target完成时,就会终止读取数字

根据题目内容介绍,我们可以使用双指针模拟来解答本题,思路如下:

  • 方法一:双指针模拟

    • 定义两个指针变量i和j,i指向list列表,j指向target数组起始位置
    • 循环遍历target数组,当i+1与target[i]元素不相等时,则需要将i+1数字先进行入栈操作,再进行出栈操作,且i指针向右移动一次
    • 当 i+1与target[i]元素相等时,则将i+1数字进行入栈操作,i和j指针同时向右移动一次
    • 直到遍历完target数组位置,返回oplist数组即可
    class Solution(object):
        def buildArray(self, target, n):
            """
            :type target: List[int]
            :type n: int
            :rtype: List[str]
            """
            oplist = []
            m = len(target)
            i,j = 0,0
            while i < n and j < m:
                if i+1 != target[j]:
                    oplist.append("Push")
                    oplist.append("Pop")
                else:
                    oplist.append("Push")
                    j +=1
                i +=1
    
            return oplist
    
  • 方法二:写法二

    • python中列表可以拼接,我们可以直接使用一行代码
    class Solution(object):
        def buildArray(self, target, n):
            """
            :type target: List[int]
            :type n: int
            :rtype: List[str]
            """
            return [i for item in [['Push'] if i in target else ['Push', 'Pop'] for i in range(1, max(target) + 1)] for i in item]
    

三、总结:

本题是一道关于栈操作的应用,依次读取list中数字构建target数组,对于target不存在的数字需要先入栈再出栈操作,AC提交记录如下:

image.png

  • 时间复杂度:O(n),push操作n次
  • 空间复杂度:O(1),除返回值没有使用额外空间

以上是本期内容,欢迎大佬们点赞评论,下期见~~~