首页 > 其他分享 >图解LeetCode——1441. 用栈操作构建数组(难度:中等)

图解LeetCode——1441. 用栈操作构建数组(难度:中等)

时间:2023-05-23 11:01:40浏览次数:49  
标签:1441 list 用栈 num result 数组 Push LeetCode target


一、题目

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

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

  • "Push":从 list 中读取一个新元素, 并将其推入数组中。
  • "Pop":删除数组中的最后一个元素。
  • 如果目标数组构建完成,就停止读取更多元素。

题目数据保证目标数组严格递增,并且只包含 1n 之间的数字。

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

二、示例

2.1> 示例 1:

【输入】target = [1,3], n = 3
【输出】["Push","Push","Pop","Push"]
【解释】 读取 1 并自动推入数组 -> [1];读取 2 并自动推入数组,然后删除它 -> [1];读取 3 并自动推入数组 -> [1,3]

2.2> 示例 2:

【输入】target = [1,2,3], n = 3
【输出】["Push","Push","Push"]

2.3> 示例 3:

【输入】target = [1,2], n = 4
【输出】["Push","Push"]
【解释】只需要读取前 2 个数字就可以停止。

提示:

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

三、解题思路

根据题目描述可以知道,list集合是严格递增的,即: list = { 1 , 2 , 3 ..., n },而且target数组也是严格递增的,因为我们最终的结果是要获取拼装成target的“动作”(“Push”/“Pop”)集合,所以,我们只需要遍历targe数组,使其与递增的num进行对比,因为num的初始值为1,每次对比num都执行加1操作,所以在最终遍历之后,它的值就是1,2,3……递增的,可以代表题目中锁描述的集合list

创建用于最终结果返回的集合List<String> result;那么,当target[i]等于num的时候,则向result中插入“Push”字符串;当target[i]不等于num的时候,则向result中插入“Push”和“Pop”字符串;依次类推,当遍历完target数组后,将最终的结果result返回即可。具体操作如下图所示:

图解LeetCode——1441. 用栈操作构建数组(难度:中等)_字符串

其实根据题意描述,我们要拼装出来能够组成target的动作集合,那么默认来说,就一定能够通过list集合拼装成target,所以,本题中的第二个参数int n,其实没什么用处了。

四、代码实现

class Solution {
    public List<String> buildArray(int[] target, int n) {
        List<String> result = new ArrayList();
        int num = 1;
        for (int item: target) {
            while (item != num) {
                result.add("Push");
                result.add("Pop");
                num++;
            }
            result.add("Push");
            num++;
        }
        return result;
    }
}

图解LeetCode——1441. 用栈操作构建数组(难度:中等)_字符串_02

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

标签:1441,list,用栈,num,result,数组,Push,LeetCode,target
From: https://blog.51cto.com/u_15003301/6330128

相关文章

  • 图解LeetCode——886. 可能的二分法(难度:中等)
    一、题目给定一组 n 人(编号为 1,2,...,n), 我们想把每个人分进任意大小的两组。每个人都可能不喜欢其他人,那么他们不应该属于同一组。给定整数n 和数组dislikes ,其中 dislikes[i]=[ai,bi] ,表示不允许将编号为ai 和  bi的人归入同一组。当可以用这种方法将所有人......
  • 图解LeetCode——827. 最大人工岛(难度:困难)
    给你一个大小为nxn二进制矩阵grid。最多只能将一格 0变成 1。返回执行此操作后,grid中最大的岛屿面积是多少?岛屿由一组上、下、左、右四个方向相连的 1形成。二、示例2.1>示例1:【输入】grid=[[1,0],[0,1]]【输出】3【解释】将一格0变成1,最终连通两个小......
  • 图解LeetCode——904. 水果成篮(难度:中等)
    一、题目你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组fruits表示,其中fruits[i]是第i棵树上的水果种类。你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:你只有两个篮子,并且每个篮子只能装单一类型的水果......
  • 代码随想录算法训练营第10天 | ● 理论基础 ● 232.用栈实现队列 ● 225. 用队列实现
     第五章 栈与队列part01●  day 1 任务以及具体安排:训练营一期day 1 ●  day 2 任务以及具体安排:day 2 第一章数组●  day 3 任务以及具体安排:day 3 第二章 链表●  day 4 任务以及具体安排:day 4 第二章 链表●  day 5 周日休息●  ......
  • #yyds干货盘点# LeetCode程序员面试金典:平衡二叉树
    题目:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例1:输入:root=[3,9,20,null,null,15,7]输出:true示例2:输入:root=[1,2,2,3,3,null,null,4,4]输出:false示例3:输入:root=[]......
  • #yyds干货盘点# LeetCode程序员面试金典:分数到小数
    1.简述:给定两个整数,分别表示分数的分子 numerator和分母denominator,以字符串形式返回小数。如果小数部分为循环小数,则将循环的部分括在括号内。如果存在多个答案,只需返回任意一个。对于所有给定的输入,保证答案字符串的长度小于104。 示例1:输入:numerator=1,denominat......
  • LeetCode 103. 二叉树的锯齿形层次遍历
    classSolution{public:vector<vector<int>>res;voidbfs(TreeNode*root){queue<TreeNode*>q;q.push(root);intcnt=0;while(!q.empty()){vector<int>level;......
  • LeetCode 周赛 346(2023/05/21)仅 68 人 AK 的最短路问题
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。LeetCode单周赛第345场·体验一题多解的算法之美单周赛345概览T1.删除子串后的字符串最小长度(Easy)标签:栈T2.字典序最小回文串(Medium)标签:贪心、双指针T3.求一个整数的惩罚数(Medium)标签......
  • leetcode724
    使用数学方法:假设左边的所有数加起来的和是sum,total为数组所有元素加起来的和,当i满足中心下标的条件时,即:sum=total-sum-nums[i];2*sum+nums[i]=total;当中心下标是首位时,即左边sum为0;当中心下标是尾位时,右边total-sum-nums[i]为0;for(inti=0;i<n;++i){if(2*sum+nums[i]==......
  • 图解LeetCode——19. 删除链表的倒数第 N 个结点
    一、题目给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。二、示例2.1>示例1:【输入】head=[1,2,3,4,5],n=2【输出】[1,2,3,5]2.2>示例2:【输入】head=[1],n=1【输出】[]2.3>示例3:【输入】head=[1,2],n=1【输出】[1]提示:链......