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;
    }
}
相关推荐
秋夫人几秒前
B+树(B+TREE)索引
数据结构·算法
kinlon.liu1 分钟前
零信任安全架构--持续验证
java·安全·安全架构·mfa·持续验证
王哲晓22 分钟前
Linux通过yum安装Docker
java·linux·docker
java66666888827 分钟前
如何在Java中实现高效的对象映射:Dozer与MapStruct的比较与优化
java·开发语言
Violet永存28 分钟前
源码分析:LinkedList
java·开发语言
执键行天涯28 分钟前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
梦想科研社36 分钟前
【无人机设计与控制】四旋翼无人机俯仰姿态保持模糊PID控制(带说明报告)
开发语言·算法·数学建模·matlab·无人机
Milo_K37 分钟前
今日 leetCode 15.三数之和
算法·leetcode
Darling_0041 分钟前
LeetCode_sql_day28(1767.寻找没有被执行的任务对)
sql·算法·leetcode
AlexMercer101242 分钟前
【C++】二、数据类型 (同C)
c语言·开发语言·数据结构·c++·笔记·算法