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

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

时间:2024-11-12 14:44:39浏览次数:3  
标签:第十一天 nums int 随想录 Pop st queue 求值 public

前言

打卡代码随想录算法训练营第49期第十一天 φ(゜▽゜*)♪

首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。


今日题目

在学习今日的题目前先看:栈与队列的内部实现机制

LeetCode 150 逆波兰表达式求值

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

文章讲解:逆波兰表达式求值

视频讲解:卡哥讲解 —— 逆波兰表达式求值

如果能读懂题目并且学过之前用栈解题,那这道题会十分简单,这里卡哥也用一个GIF直接将题讲清楚了,我也就不过多赘述。

public class Solution {
    public int EvalRPN(string[] tokens) {
        Stack<int> st = new Stack<int>();
        for(int i = 0; i < tokens.Length; i++)
        {
            //判断如果是+ - * /就取出两个值进行计算
            if(tokens[i] == "+")
            {
                int num1 = st.Pop();
                int num2 = st.Pop();
                st.Push(num1 + num2);
            }
            else if(tokens[i] == "-")
            {
                int num1 = st.Pop();
                int num2 = st.Pop();
                st.Push(num2 - num1);
            }
            else if(tokens[i] == "*")
            {
                int num1 = st.Pop();
                int num2 = st.Pop();
                st.Push(num1 * num2);
            }
            else if(tokens[i] == "/")
            {
                int num1 = st.Pop();
                int num2 = st.Pop();
                st.Push(num2 / num1);
            }
            //如果不是 则直接压入该值
            else
                st.Push(int.Parse(tokens[i]));
        }
        return st.Pop();
    }
}

LeetCode 239 滑动窗口最大值

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

文章讲解:滑动窗口最大值

视频讲解:卡哥讲解 —— 滑动窗口最大值

本题思路是我们只需要获取一个滑动窗口的最大值,所以我们只需要维护每一组数据的最大值即可,同时保证这个数据是从大到小依次排列。本题相对复杂,需要自己去构建一个容器,但好在整体思路不是特别麻烦。

 

public class Solution {
    public int[] MaxSlidingWindow(int[] nums, int k) {
        List<int> res = new List<int>();
        MyQueue queue = new MyQueue();
        for(int i = 0; i < k; i++)//先装够滑动窗口的数量
            queue.Enqueue(nums[i]);
        res.Add(queue.Max());//添加第一个值
        for(int i = k; i < nums.Length; i++)
        {
            //之后反复添加删除求值即可
            queue.Dequeue(nums[i - k]);
            queue.Enqueue(nums[i]);
            res.Add(queue.Max());
        }
        return res.ToArray();
    } 
}
public class MyQueue
{
    //使用一个容器来模拟整个队列,需要维持容器第一个值为最大值
    public LinkedList<int> queue = new LinkedList<int>();
    //填入数据方法
    public void Enqueue(int num)
    {
        //如果比整个容器最后一个数据要大,就替换这个数据
        while(queue.Count > 0 && num > queue.Last.Value)
            queue.RemoveLast();
        queue.AddLast(num);
    }
    public void Dequeue(int num)
    {
        //如果要移除的数是最大值,则才用移除
        if(num == queue.First.Value)
            queue.RemoveFirst();
    }
    public int Max()
    {
        //最大值就是第一个值
        return queue.First.Value;
    }
}


LeetCode 347 前K个高频元素

题目链接:347 前K个高频元素

文章讲解:前 K 个高频元素

视频讲解:卡哥讲解 —— 前 K 个高频元素

本题最简单的思路就是统计频率,在对频率进行排序,返回前K个,但是时间复杂度就会偏高,而这里使用堆的概念,使用小顶堆,这样如果超过了K个数量,每次弹出的就是堆中频率最小的数。

public class Solution {
    public int[] TopKFrequent(int[] nums, int k) {
        //统计每个元素的频率
        Dictionary<int,int> dic = new Dictionary<int,int>();
        for(int i = 0; i < nums.Length; i++)
        {
            if(dic.ContainsKey(nums[i]))
                dic[nums[i]]++;
            else
                dic.Add(nums[i] , 1);
        }
        //设置优先级队列,求得前k个高频元素
        PriorityQueue<int , int> pq = new PriorityQueue<int , int>();
        foreach(var num in dic)
        {
            pq.Enqueue(num.Key , num.Value);
            if(pq.Count > k)
                pq.Dequeue();
        }
        //将结果填入数组
        int[] res = new int[k];
        for(int i = k - 1; i >= 0; i--)
            res[i] = pq.Dequeue();
        return res;
    }
}

今天的题相对要难一些,需要重复的学习和练习,明天见~~~

标签:第十一天,nums,int,随想录,Pop,st,queue,求值,public
From: https://blog.csdn.net/tancxiaohei23/article/details/143712799

相关文章

  • 代码随想录 -- 动态规划 -- 完全背包理论基础
    52.携带研究材料(第七期模拟笔试)思路:dp[j]的含义:装满容量为j的背包时,背包的最大价值为dp[j].递推公式:当j>=weight[i]时:dp[j]=max(dp[j],dp[j-weight[i]]+value[i])初始化:全部初始化为0遍历顺序:先遍历物品和先遍历背包都可以,都是从前往后遍历(因为物品可以重复使用)。n,......
  • 代码随想录第八天|字符串part01--344.反转字符串、541.反转字符串Ⅱ、卡玛网54.替换数
    资源引用:leetcode题目:344.反转字符串(344.反转字符串-力扣(LeetCode))541.反转字符串Ⅱ(541.反转字符串II-力扣(LeetCode))卡玛网题目:卡玛网54.替换数字(54.替换数字(第八期模拟笔试)(kamacoder.com))碎碎念回归:本来应该11月6号打卡的,因为接连4天的考试+多个竞赛,导致推迟......
  • 代码随想录算法训练营第三天(LeetCode203.移除链表元素;LeetCode707.设计链表;LeetCode20
    LeetCode203.移除链表元素题目链接:LeetCode203.移除链表元素题目链接思路这道题目主要考察的是移除一个链表当中的元素,我们可以先在给定的链表前面加一个虚拟头结点,这样我们对给定链表头结点的操作和给定链表其余结点的操作就会变得相同。代码classSolution{p......
  • 代码随想录算法训练营第四天(LeetCode24.两两交换链表中的节点;LeetCode10.删除链表的倒
    LeetCode24.两两交换链表中的节点题目链接:两两交换链表中的节点题目链接思路这道题其实就是一个模拟题,要求每次交换链表中两个相邻的节点(1、2节点互换;3、4节点互换;2、3节点不互换,意思就是交换过的节点不参与后续的交换了),同时只能进行节点交换,不能进行值交换。主要考......
  • 代码随想录算法训练营第二十二天| leetcode77. 组合、leetcode216.组合总和III、leetc
    1leetcode77.组合题目链接:77.组合-力扣(LeetCode)文章链接:代码随想录视频链接:带你学透回溯算法-组合问题(对应力扣题目:77.组合)|回溯法精讲!_哔哩哔哩_bilibili思路:开始想循环,感觉行不通,然后看了视频,就嗯理解了一些感觉跟递归的思路确实差不多1.1回溯三部曲回溯的方法首......
  • 代码随想录算法训练营day43| 300.最长递增子序列 674. 最长连续递增序列 718. 最长
    学习资料:https://programmercarl.com/0300.最长上升子序列.html#算法公开课动态规划系列之子序列学习记录300.最长递增子序列(长度最少为1;dp[i]代表到i为止的最长子序列的长度;i的值根据i之前比如j的值来判断;每个地方都有可能获得最长长度)点击查看代码classSolution:def......
  • 代码随想录算法训练营第十一天 | 150. 逆波兰表达式求值+ 239. 滑动窗口最大值+347.前
    今天接着补上周末的栈与队列的part2,下午继续完成今天的任务。150.逆波兰表达式求值 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。注意:有效的算符为 '+'、'-'、'*' 和 '/' 。每个......
  • 代码随想录算法训练营第十天 | 232.用栈实现队列+225. 用队列实现栈+20. 有效的括号+1
    加入训练营有点晚,没跟上任务就开始有些偷懒没有真的认真开始,从第十天开始下决心认真完成每天任务还有博客记录学习过程。栈与队列理论基础首先是学习了栈和队列的理论基础,队列 先进先出,栈 先进后出。栈 以底层容器完成其所有的工作,且对外接口统一,有.push,.pop等,不提供......
  • 代码随想录——二叉树-12.平衡二叉树
    自顶向下递归(前序遍历)这种方法是一开始想到的,虽然ac了但是对于它的本质却不清不楚,不知道时间复杂度,不知道属于前序遍历。思路首先得到root节点的左右子树的深度(左右),若深度差绝对值大于1(中),则root为根的树不是平衡二叉树;否则继续递归root的左右子树,其左右子树都是平衡二叉树......
  • 代码随想录——二叉树-11.完全二叉树的节点个数
    思路一、层序遍历,时间复杂度O(n)二、利用完全二叉树性质,时间复杂度O(logn*logn)(小于O(n))完全二叉树性质:若树深度为h,则前h-1层节点都达到最大值。第h层节点都集中在最左侧的位置完全二叉树要么1.是满二叉树2.最后一层没满满二叉树计算节点数太方便了,直接用公式2^h-1。......