Leetcode Stackqueue 239 347

news/2024/11/23 0:30:46/

Leetcode 239

  1. 整体思想:用一个deque维护滑动窗口中的最大值

滑动窗口移动时,要删除掉最前面的数,并加入一个新的数,当新加入数的前面有小于这个数的值时,要把前面的数都pop掉,直到遇到最大值

  1. deque:

  • 是一个双端队列,存储不一定在连续空间

  • 要用push_back(), push_front(), pop_back(), pop_front()

class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {deque<int> que;vector<int> res;for(int i=0; i<k; i++){while(!que.empty() && que.back() < nums[i]){que.pop_back();}que.push_back(nums[i]);}res.push_back(que.front());for(int i=k; i<nums.size(); i++){if(que.front() == nums[i-k]){que.pop_front();}while(!que.empty() && que.back() < nums[i]){que.pop_back();}que.push_back(nums[i]);res.push_back(que.front());}return res;}
};

需要注意的点:第一次遍历完k个值之后,要把deque的第一个数存入res里,不然第一个滑动窗口的值就被略过了

Leetcode 347 Top K Frequent Elements

用哈希表

class Solution {
public:vector<int> topKFrequent(vector<int>& nums, int k) {unordered_map<int, int> map;for(int num:nums){map[num]++;}multimap<int, int> orderMap;for(auto iter:map){orderMap.insert(make_pair(iter.second, iter.first));}vector<int> res;for(auto iter = orderMap.rbegin(); iter != orderMap.rend(); iter++){if(k > 0){res.push_back(iter->second);k--;}}return res;}
};
  1. multimap 用key排序,为升序

Priority queue

class Solution {
public:class mycomparison{public:bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs){return lhs.second > rhs.second;}};vector<int> topKFrequent(vector<int>& nums, int k) {unordered_map<int, int> map;for(int num:nums){map[num]++;}priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pri_que;for(auto iter = map.begin(); iter != map.end(); iter++){pri_que.push(*iter);if(pri_que.size() > k){pri_que.pop();}}vector<int> res;for(int i=0; i<k; i++){res.push_back(pri_que.top().first);pri_que.pop();}return res;}
};
  1. 使用小顶堆

  1. 如何写仿函数(这里有点不太明白,之后要在看一下)

  1. priority_queue<Type, Container, Functional>

  • Container: 必须是数组实现的容器, 比如vector,deque, 不能用list(默认是vector)

  • Function是比较的方式

  • 使用基本数据类型时,默认大顶堆

(Priority这里之后需要再回顾,主要是看比较方式)


http://www.ppmy.cn/news/551939.html

相关文章

343

class Program{static void Main(string[] args){Primes primesFrom2To1000 new Primes(2, 1000);foreach (long i in primesFrom2To1000)Console.Write("{0} ", i);Console.ReadKey();}}

leetcood_347 C语言

题目描述&#xff1a;给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按任意顺序 返回答案。 示例 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2] 输入: nums [1], k 1 输出: [1] 提示 1 < nums.length < 105 k 的取值范…

第 347 场周赛

A 移除字符串中的尾随零 模拟 class Solution { public:string removeTrailingZeros(string num) {while(num.back()0)num.pop_back();return num;} };B 对角线上不同值的数量差 还是模拟… class Solution { public:vector<vector<int>> differenceOfDistinc…

算法day 13|239,347

今日内容&#xff1a; 239. 滑动窗口最大值 347.前 K 个高频元素 总结 239. 滑动窗口最大值 &#xff08;一刷至少需要理解思路&#xff09; class Myqueue(object):def __init__(self):self.queue deque()#保留队列最大的元素在队列里面&#xff0c;其他都pop掉def push(sel…

【C++核心】函数的应用和提高详解

一. 函数 1.1 概述 作用&#xff1a; 将一段经常使用的代码封装起来&#xff0c;减少重复代码。一个较大的程序&#xff0c;一般分为若干个程序块&#xff0c;每个模块实现特定的功能。 1.2 函数的定义 函数的定义一般主要有5个步骤&#xff1a; 1、返回值类型 2、函数名 3…

从零开始理解Linux中断架构(7)--- Linux执行上下文之中断上下文

1 中断处理程序的基本要求 当前运行的loop是一条执行流,中断程序运行开启了另外一条执行流,从上一节得知这是三种跳转的第三类,这个是一个大跳转。对中断程序的基本要求就是中断执行完毕后要恢复到原来执行的程序,除了时间流逝外,原来运行的程序应该毫无感知。 具体到Armv…

【工具】Spring 历史官方文档理解(持续更新)

文章目录 [1] Spring Framework 5.2.24CoreAOP 概念AspectJoin pointAdvicePointcutIntroductionTarget objectAOP proxyWeaving Spring AOPAspectJ官方 demo 学习 Pointcut 表达式官方 demo 学习 Advice 声明官方 demo 学习 Introductions &#xff08;接口拓展&#xff09;AO…

5.2.3目录与文件之权限意义

现在我们知道了Linux系统内文件的三种身份&#xff08;拥有者、群组与其他人&#xff09;&#xff0c;知道每种身份都有三种权限&#xff08;rwx&#xff09;&#xff0c; 已知道能够使用chown, chgrp, chmod去修改这些权限与属性&#xff0c;当然&#xff0c;利用ls -l去观察文…