leetcode(Hot100)——栈与列表

1、用栈实现队列

一个栈进,一个栈出。

java 复制代码
class MyQueue {
    private LinkedList<Integer> stk1 = new LinkedList<>();
    private LinkedList<Integer> stk2 = new LinkedList<>();

    public MyQueue() {

    }
    
    public void push(int x) {
        stk1.push(x);
    }
    
    public int pop() {
        if(stk2.isEmpty()){
            while(!stk1.isEmpty()){
                stk2.push(stk1.pop());
            }
        }
        return stk2.pop();
    }
    
    public int peek() {
        if(stk2.isEmpty()){
            while(!stk1.isEmpty()){
                stk2.push(stk1.pop());
            }
        }
        return stk2.peek();
    }
    
    public boolean empty() {
        return stk1.isEmpty() && stk2.isEmpty();
    }
}

2、用队列实现栈

两个队列,一个队列负责存,第二个队列用于过滤数据。

java 复制代码
class MyStack {
    private LinkedList<Integer> que1 = new LinkedList<>();
    private LinkedList<Integer> que2 = new LinkedList<>();

    public MyStack() {

    }
    
    public void push(int x) {
        que1.addFirst(x);
    }
    
    public int pop() {
        int count = que1.size()-1;
        while(count > 0){
            que2.addFirst(que1.removeLast());
            count--;
        }
        int res = que1.removeLast();
        while(!que2.isEmpty()){
            que1.addFirst(que2.removeLast());
        }
        return res;
    }
    
    public int top() {
        return que1.getFirst();
    }
    
    public boolean empty() {
        return que1.isEmpty();
    }
}

3、前 K 个高频元素

比较朴素的做法是用一个map存储每个数字的出现频率,再从中选出k个最大频率的数字。本题也可以用优先队列的方式来做。

java 复制代码
class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        HashMap<Integer,Integer> map = new HashMap<>();
        List<Integer> ans = new ArrayList<>();
        for(int i=0; i<nums.length; i++){
            map.put(nums[i],map.getOrDefault(nums[i],0) + 1);
        }
        for(int i=0; i<k; i++){
            int max_freq = Integer.MIN_VALUE;
            int key = 0;
            for(Map.Entry<Integer,Integer> entry : map.entrySet()){
                if(entry.getValue() > max_freq){
                    max_freq = entry.getValue();
                    key = entry.getKey();
                }
            }
            ans.add(key);
            map.remove(key);
        }
        int[] res = new int[ans.size()];
        for(int i=0; i<res.length; i++){
            res[i] = ans.get(i);
        }
        return res;
    }
}

3、有效的括号

栈的经典应用,括号匹配 问题。 思路是构建一个临时栈,然后遍历字符串,如果是( { [ 就放入栈,如果不是就判断一下栈顶是否和{ ( [ 匹配,如果不匹配就返回false。 遍历完后,如果栈是空的则返回true。

java 复制代码
class Solution {
    public boolean isValid(String s) {
        LinkedList<Character> stk = new LinkedList<>();
        for(int i=0; i<s.length(); i++){
            if(stk.isEmpty()){
                if(s.charAt(i)==')' || s.charAt(i)==']' || s.charAt(i)=='}'){
                    return false;
                }
                stk.push(s.charAt(i));
            }
            else{
                if(stk.getFirst() == '('){
                    if(s.charAt(i) == ')'){
                        stk.pop();
                    }
                    else{
                        stk.push(s.charAt(i));
                    }
                }
                else if(stk.getFirst() == '['){
                    if(s.charAt(i) == ']'){
                        stk.pop();
                    }
                    else{
                        stk.push(s.charAt(i));
                    }
                }
                else if(stk.getFirst() == '{'){
                    if(s.charAt(i) == '}'){
                        stk.pop();
                    }
                    else{
                        stk.push(s.charAt(i));
                    }
                }
            }
        }
        if(stk.isEmpty()) return true;
        else return false;
    }
}
相关推荐
天天摸鱼的java工程师13 分钟前
Snowflake 雪花算法优缺点(Java老司机实战总结)
java·后端·面试
类球状17 分钟前
顺序表 —— OJ题
算法
Miraitowa_cheems41 分钟前
LeetCode算法日记 - Day 11: 寻找峰值、山脉数组的峰顶索引
java·算法·leetcode
海梨花1 小时前
【从零开始学习Redis】项目实战-黑马点评D2
java·数据库·redis·后端·缓存
共享家95271 小时前
linux-高级IO(上)
java·linux·服务器
橘子郡1231 小时前
观察者模式和发布订阅模式对比,Java示例
java
指针满天飞1 小时前
Collections.synchronizedList是如何将List变为线程安全的
java·数据结构·list
Java技术小馆1 小时前
重构 Controller 的 7 个黄金法则
java·后端·面试
CoovallyAIHub1 小时前
方案 | 动车底部零部件检测实时流水线检测算法改进
深度学习·算法·计算机视觉
CoovallyAIHub1 小时前
方案 | 光伏清洁机器人系统详细技术实施方案
深度学习·算法·计算机视觉