leetcode刷题(5)

简介: 各位朋友们,大家好,今天是我leedcode刷题的第五篇,我们一起来看看吧。

栈的压入,弹出序列

leetcode之栈的压入与弹出序列(难度:中等)


题目要求


输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。


用例输入


示例 1:

输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]

输出:true

解释:我们可以按以下顺序执行:

push(1), push(2), push(3), push(4), pop() -> 4,

push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1


示例 2:

输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]

输出:false

解释:1 不能在 2 之前弹出。


提示


0 <= pushed.length == popped.length <= 1000

0 <= pushed[i], popped[i] < 1000

pushed 是 popped 的排列。


做题思路

我们来分别遍历这两个数组,遍历的同时先将pushed数组压入栈中,然后我们判断栈顶的数据是否跟popped数组的数据相等,如果相等就出栈,popped数组的下标+1,不相等我们就继续将pushed数组中的数据压入栈中,循环中这个数组,最后如果栈中为空则说明popped序列是pushed数组的弹出序列,不为空则不是。


1.png

2.png

3.png

4.png

此时栈顶的数据等于popped[j],所以我们弹出栈顶的数据,并且将j++;

5.png

6.png

栈顶数据等于popped[j],继续弹出。

7.png

继续该操作

8.png

栈里面为空,所以我们返回true。


代码实现

C语言代码实现

bool validateStackSequences(int* pushed, int pushedSize, int* popped, int poppedSize){
    int* arr = (int*)malloc(pushedSize*sizeof(int));
    int tail = 0;
    int j = 0;
    for(int i = 0; i<pushedSize; i++)
    {
        arr[tail] = pushed[i];
        while(j<poppedSize && tail>=0 && arr[tail] == popped[j])
        {
            tail--;
            j++;
        }
        tail++;
    }
    return tail==0;
}

9.png

Java代码实现

class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        Stack<Integer> stack = new Stack<>();
        int j = 0;
        for(int i = 0; i<pushed.length; i++) {
            stack.push(pushed[i]);
            while( j<popped.length && !stack.empty()  && stack.peek().equals(popped[j])) {
                stack.pop();
                j++;
            }
        }
        return stack.empty();
    }
}

10.png

最小栈

leetcode之最小栈(难度:中等)


题目要求


设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。


实现 MinStack 类:


MinStack() 初始化堆栈对象。

void push(int val) 将元素val推入堆栈。

void pop() 删除堆栈顶部的元素。

int top() 获取堆栈顶部的元素。

int getMin() 获取堆栈中的最小元素。


这是一幕提供的接口

class MinStack {
    public MinStack() {
    }
    public void push(int val) {
    }
    public void pop() {
    }
    public int top() {
    }
    public int getMin() {
    }
}
/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */

用例输入


示例 1:

输入:

[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”]

[[],[-2],[0],[-3],[],[],[],[]]


输出:

[null,null,null,null,-3,null,0,-2]


解释:

MinStack minStack = new MinStack();

minStack.push(-2);

minStack.push(0);

minStack.push(-3);

minStack.getMin(); --> 返回 -3.

minStack.pop();

minStack.top(); --> 返回 0.

minStack.getMin(); --> 返回 -2.


提示

-231 <= val <= 231 - 1

pop、top 和 getMin 操作总是在 非空栈 上调用

push, pop, top, and getMin最多被调用 3 * 104 次


做题思路

这个题目需要我们使用两个栈,一个栈用来放所有整数,一个的栈顶存放的是最小的整数,叫做最小栈。当我们入栈的时候,当第一次入栈的时候因为最小栈里面是空的,所以我们直接将数据压入栈中,后来入最小栈的时候,我们就需要判断需要入栈的这个数据是否小于最小栈栈顶的数据,如果小于或等于就入栈,否则不入栈。当我们出栈的时候我们还需要对最小栈做出变化,当我们出栈的这个数等于最小栈的栈顶的数据,我们也将最小栈栈顶的数据弹出。后面的返回栈顶的数据,跟栈中的最小值我就不多叙述了。

11.png

12.png

13.png

14.png

15.png

重复此操作

16.png

然后我们在弹出三次栈

弹出的7不等于MinStack栈顶的-1

17.png

-1等于MinStack栈顶的-1,所以MinStack也需要弹出

18.png

19.png

代码实现

因为这道题用C语言实现较复杂,所以我们这个题就直接用Java来实现。


Java代码实现

class MinStack {
    private Stack<Integer> stack;
    private Stack<Integer> minstack;
    public MinStack() {
        stack = new Stack<>();
        minstack = new Stack<>();
    }
    public void push(int val) {
        stack.push(val);
        if(minstack.empty()) {
            minstack.push(val);
        } else {
            if(val <= minstack.peek()) {
                minstack.push(val);
            }
        }
    }
    public void pop() {
    //判断栈是否为空
        if(!stack.empty()) {
        这里我们用Integer防止取出的数据不在-128~127之间
            Integer val = stack.peek();
            stack.pop();
            if(val.equals(minstack.peek())) {
                minstack.pop();
            }
        }
    }
    public int top() {
        if(!stack.empty()) {
            return stack.peek();
        }
        return -1;
    }
    public int getMin() {
        if(!minstack.empty()) {
            return minstack.peek();
        }
        return -1;
    }
}
/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */

20.png

相关文章
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
55 6
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
47 4
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
108 2
|
11天前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
14 1
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
3月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
54 7
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
25 4
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
51 5
|
3月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
50 3