首页 > 编程语言 >代码随想录算法训练营第十一天(LeetCode150.逆波兰表达式求值;LeetCode239.滑动窗口最大值;LeetCode347.前K个高频元素)

代码随想录算法训练营第十一天(LeetCode150.逆波兰表达式求值;LeetCode239.滑动窗口最大值;LeetCode347.前K个高频元素)

时间:2024-11-26 16:00:45浏览次数:10  
标签:第十一天 deque int 元素 随想录 pop push 求值 stack

LeetCode 150. 逆波兰表达式求值

题目链接:逆波兰表达式求值题目链接

思路

主要是要理解逆波兰表达式的定义,在理解了逆波兰表达式的定义后,使用栈就可以直接做了。
逆波兰表达式是一种后缀表达式,所谓后缀就是指运算符写在后面。
平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。
该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。
逆波兰表达式主要有以下两个优点:
1.去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
2.适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。

代码

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack=new Stack<>();
        for(String s:tokens)
        {
            if("+".equals(s))
            {
                stack.push(stack.pop()+stack.pop());
            }
            else if("-".equals(s))
            {
                stack.push(-stack.pop()+stack.pop()); 
            }
            else if("*".equals(s))
            {
                stack.push(stack.pop()*stack.pop());
            }
            else  if("/".equals(s))
            {
                int temp1=stack.pop();
                int temp2=stack.pop();
                stack.push(temp2/temp1);
            }
            else
            {
                stack.push(Integer.valueOf(s));
            }
        }
         return stack.pop();
    }
}

LeetCode 239. 滑动窗口最大值

题目链接:滑动窗口最大值题目链接

思路

自己设计一个单调队列,有三个函数 pop 函数、push 函数和 getMaxValue 函数,每次将一个元素 push 进入单调队列,如果单调队列现存的元素全部小于 push 进来的元素,那么单调队列现存的元素全部 pop 出去,同时,如果 push 现存的元素后,单调队列中的元素个数大于 k 的时候,那么也要 pop 元素出去,这样可以保证单调队列队头元素就是我们想要获得的最大值,getMaxValue 函数就是获取单调队列的队头元素。

代码

class MyQueue{
    Deque<Integer> deque=new LinkedList<>();
    void poll(int val)
    {
        if(!deque.isEmpty()&&val==deque.peek())
        {
            deque.poll();
        }
    }

    void add(int val)
    {
        while(!deque.isEmpty()&&val>deque.getLast())
        {
            deque.removeLast();
        }
        deque.add(val);
    }
    int peek()
    {
        return deque.peek();
    }
}
class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums.length==1)
            return nums;
        int len=nums.length-k+1;
        int[] res=new int[len];
        int num=0;
        MyQueue myQueue=new MyQueue();
        for(int i=0;i<k;i++)
            myQueue.add(nums[i]);
        res[num++]=myQueue.peek();
        for(int i=k;i<nums.length;i++)
        {
            myQueue.poll(nums[i-k]);
            myQueue.add(nums[i]);
            res[num++]=myQueue.peek();
        }
        return res;
    }
}

LeetCode 347. 前 k 个高频元素

题目链接:前k个高频元素题目链接

思路

首先将数组里面的元素存入一个 Map 键值对中,键是数组的元素,值是数组元素出现的频率。然后设计一个小顶堆,大小被限制为 k,将 Map 键值对存入小顶堆中,对 Map 的值进行小顶堆排序,小顶堆是先弹出频率较小的元素,所以数组存储要倒序存储。

代码

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer,Integer>map=new HashMap<>();
        for(int num:nums)
        {
            map.put(num,map.getOrDefault(num,0)+1);
        }
        PriorityQueue<int[]> pq=new PriorityQueue<>((pair1,pair2)->pair1[1]-pair2[1]);
        for(Map.Entry<Integer,Integer>entry:map.entrySet())
        {
            if(pq.size()<k)
                pq.add(new int[]{entry.getKey(),entry.getValue()});
            else
            {
                if(entry.getValue()>pq.peek()[1])
                {
                    pq.poll();
                    pq.add(new int[]{entry.getKey(),entry.getValue()});
                }
            }
        }
        int[] ans=new int[k];
        for(int i=k-1;i>=0;i--)
            ans[i]=pq.poll()[0];
        return ans;

    }
}

标签:第十一天,deque,int,元素,随想录,pop,push,求值,stack
From: https://blog.csdn.net/qq_51597940/article/details/144040310

相关文章

  • 代码随想录算法训练营第十天(LeetCode232.用栈实现队列;LeetCode225.用队列实现栈;LeetCo
    LeetCode232.用栈实现队列题目链接:用栈实现队列题目链接思路队列是先进先出,栈是先进后出,为了能够让栈可以模拟队列的先进先出,我们设置两个栈,一个栈作为入栈,一个栈作为出栈,我们在入栈存储完数据后,将入栈中的数据全部存储到出栈中,那么从出栈中弹出来的数据就是先进先出的......
  • 代码随想录——26、二叉(搜索)树的最近公共祖先
    递归最近公共祖先定义:设节点root为节点p,q的某公共祖先,若其左子节点root.left和右子节点root.right都不是p,q的公共祖先,则称root是“最近的公共祖先”。若root是p,q的最近公共祖先,则只可能为以下情况之一如果p和q在节点root的两侧,那么root就是最近公共祖先p......
  • 代码随想录算法训练营day55 day57| 108.冗余连接 109.冗余连接II 53.寻宝
    学习资料:https://www.programmercarl.com/kamacoder/0108.冗余连接.html#思路图论并查集prim算法kruskal算法学习记录:108.冗余连接点击查看代码#并查集解法classUnionFind:def__init__(self,size):self.parent=list(range(size+1))deffind(se......
  • 代码随想录算法训练营第十二天|二叉树理论基础|二叉树的递归遍历|二叉树的迭代遍历|二
    二叉树的理论基础二叉树的主要形式:        二叉树有两种主要的形式:满二叉树和完全二叉树;    满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。可以说深度为k,有2^k-1个节点的二叉树。       ......
  • 代码随想录之滑动窗口、螺旋矩阵、区间和、开发商土地;Java之数据结构、集合源码、File
    代码随想录滑动窗口1、如果给两个字符串s和t,判断t是否为s的子串或是否s包含t的排列,用t的长度固定滑动窗口的大小,初始化将s的前t.length()个长度的字符情况存储在int数组中,int数组的大小由字符串中字符的类型决定,最大为ascii表的长度,为128。  每次循环滑动窗口向前移一位,即lef......
  • 代码随想录:快乐数
    代码随想录:快乐数这题主要是学习一下几种set怎么用。三种set,第一种第二种都是有序的,注意这个序列和插入序列无关,只和插入元素本身有关。第三种哈希表,无序,如果只需要找元素是否出现过,用第三种刚刚好。集合底层实现是否有序数值是否可以重复能否更改数值查询效率增删效......
  • 代码随想录算法训练营第十一天|LC150.逆波兰表达式求值|LC239.滑动窗口最大值|LC347.
    150.逆波兰表达式求值-力扣(LeetCode)题目要求:    1、整数除法只保留整数部分;    2、该表达式总会得出有效数值且部存在除数为0的情况;    3、逆波兰表达式:是一种后缀表达式,所谓后缀就是指运算符写在后面。fromtypingimportListfromoperato......
  • 代码随想录算法训练营第二十五天|LeetCode491.递增子序列、46.全排列、47.全排列II、3
    前言打卡代码随想录算法训练营第49期第二十五天  ○(^皿^)っHiahiahia…首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。今......
  • 代码随想录刷题学习日记
    仅为个人记录复盘学习历程,解题思路来自代码随想录代码随想录刷题笔记总结网址:代码随想录376.摆动序列如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。给定一个整数序列,......
  • 代码随想录算法训练营第十三天| 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子
    110.平衡二叉树题目链接:.-力扣(LeetCode)文章链接:代码随想录视频链接:后序遍历求高度,高度判断是否平衡|LeetCode:110.平衡二叉树_哔哩哔哩_bilibili《代码随想录》算法公开课开讲啦!快来打卡!本期视频的文字讲解版在「代码随想录」刷题网站:programmercarl.com,这里刷题顺序,详......