news 2026/10/24 2:22:22

力扣刷题小集

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
力扣刷题小集

LeetCode.347前k个高频元素

思路

(1)统计频次:用unordered_map遍历nums原数组,key存数组元素值,value存该元素出现次数。

(2)维护大小为 k 的小顶堆(为什么选择小顶堆而不是大顶堆如下图)(后边出面试常考的时候在细细说topK问题的时候仔细说这个)

(3)组装result:依次取出堆顶元素的key(nums[i]),倒序填入结果数组返回。

代码

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>mp; for (int i = 0; i < nums.size(); i++) { mp[nums[i]]++; } priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison>pri_que; for (unordered_map<int, int>::iterator it = mp.begin(); it != mp.end(); it++) { pri_que.push(*it); if (pri_que.size() > k) { pri_que.pop(); } } vector<int>result(k); for (int i = k - 1; i >= 0; i--) { result[i] = pri_que.top().first; pri_que.pop(); } return result; } };

小结

(1)这个自定义函数是什么?

是一个仿函数(函数对象),用来做比较规则,一般给priority_queue(优先队列 / 大根堆小根堆)用。

这个仿函数的比较规则:拿 pair 的第二个成员比较,用于优先队列,做成按第二个值的大根堆。

(2)仿函数又是什么呢?

仿函数(函数对象)= 重载了()运算符的类,它的对象用起来和普通函数完全一样,所以叫 "模仿函数的东西"。

(3)那它和普通函数有什么区别吗?

仿函数可以在类里存自己的状态 / 成员变量,普通函数做不到;STL 的模板(priority_queue、sort)要求传一个类型,仿函数是类可以直接当模板参数传,普通函数不行。

LeetCode.239.滑动窗口的最大值

思路

(其实懒大王只会暴力求解来着,但是苦哈哈过不去 只得求助豆包之......)

  1. 用双端队列存元素下标,队列内对应的值从队头到队尾严格递减,队头永远是当前窗口的最大值;
  2. 每遍历一个新元素做三步:把滑出窗口的队头元素弹出、把队尾所有比当前元素小的元素淘汰、再把新元素下标入队尾;
  3. 窗口成型后,直接取队头的值就是当前窗口最大值,存入结果即可。

代码

class Solution { public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { deque<int> dq; // 存元素下标,队列内对应的值从队头到队尾严格递减 vector<int> res; for (int i = 0; i < nums.size(); i++) { // 1. 队头元素已经滑出当前窗口,直接弹出 if (!dq.empty() && dq.front() <= i - k) { dq.pop_front(); } // 2. 队尾所有比当前元素小的,全部弹出: // 后面来了更大的数,这些小的永远没机会当窗口最大值,提前淘汰 while (!dq.empty() && nums[dq.back()] < nums[i]) { dq.pop_back(); } // 3. 当前下标入队尾 dq.push_back(i); // 4. 第一个窗口形成后,队头就是当前窗口最大值,存入结果 if (i >= k - 1) { res.push_back(nums[dq.front()]); } } return res; } };

LeetCode94.二叉树的中序遍历(迭代算法)

思路

用两个容器分工:result存最终结果,stack临时存放待回溯的节点指针。

只要还有节点要压、或还有节点要弹,就不停向左压,压到底之后就开始弹栈访问。

代码

class Solution { public: vector<int> inorderTraversal(TreeNode* root) { //用迭代算法实现中序遍历,(左-根-右) //创建一个数组存放最终结果,创建一个栈存放临时的节点 vector<int>result; stack<TreeNode*>sk; TreeNode* cur=root; //如果根为空的话,直接返回空的数组 if(root==nullptr)return result; //根不为空时,一直往左子树“读”,直到叶子节点为止,就开始往外“弹”入结果数组,然后根,右 while(cur!=nullptr||!sk.empty()){ while(cur!=nullptr){ sk.push(cur); cur=cur->left; } TreeNode* node = sk.top(); result.push_back(node->val); sk.pop(); cur=node->right; } return result; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/24 2:22:03

前端转全栈不再难!2026年必备技能,轻松拿回技术评审主动权

文章探讨了前端在技术评审中常感到的无力感&#xff0c;以及如何通过转型全栈来克服这种困境。文章指出&#xff0c;2026年的全栈开发门槛已大幅降低&#xff0c;得益于平台自动化和AI辅助&#xff0c;前端只需专注核心技能如HTTP、后端逻辑、数据库和接口设计&#xff0c;八到…

作者头像 李华
网站建设 2026/10/24 2:21:57

小白/程序员必看:收藏这份Agent评测指南,解锁大模型行动力!

本文探讨了传统大模型评测方法在Agent评估中的局限性&#xff0c;强调了评估Agent需关注行动过程而非仅看结果。美团Agent评测体系提出&#xff0c;应评估由模型、Prompt、工具等组成的复杂系统&#xff0c;通过轨迹评估和结果评估两类问题&#xff0c;确保Agent稳定上线。文章…

作者头像 李华
网站建设 2026/10/24 2:20:58

Zend联合创始人Zeev离职,背后真相揭秘

昨日的消息显示, 联合创始人Zeev已经在推特上宣布说自己已经离职了, 原因是他在工作长达20年之后离开了公司。Zeev 他在推特这个平台上面用来做自我介绍的话说, 他是叫做 PHP 的联席架构师的职位的人, 他也是 Zend 这个公司的联合创始人, 这两个头衔里面有个细节要注意, 原文写…

作者头像 李华
网站建设 2026/10/24 2:20:57

注释不是累赘,而是代码的说明书

在代码里面, 那些以#开头的单行文字, 或者是被三引号包裹起来的文本内容, 这些统统都叫做注释。注释有一个非常明显的特点, 那就是它只会被人用来阅读, 主要作用就是解释说明, 等到解释器去运行代码的时候, 会直接把它忽略掉, 完全不会参与程序的执行过程, 当然也不会对代码的运…

作者头像 李华
网站建设 2026/10/24 2:20:46

从零开始学 UI 第一篇:Figma 快速上手实战指南(上)

&#x1f539;博主名称&#xff1a;_Doubletful大家好&#xff0c;欢迎来到Doubletful的博客&#x1faa2;博主的GitHub&#xff1a;Go to git_hub&#x1f4a0;移动应用开发专栏&#x1f537;路漫漫其修远兮&#xff0c;吾将上下而求索文章目录序言什么是 UI 设计&#xff1f;…

作者头像 李华