news 2026/4/26 2:30:50

pq优先处理最优候选|桶排序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
pq优先处理最优候选|桶排序

lc2335

用大根堆每次抓最多的两种水各装一杯

装完剩一种水就直接把剩余杯数算成时间,最快装满所有杯子

class Solution {
public:
int fillCups(vector<int>& a) {
priority_queue<int> q;
for (int x : a) if (x) q.push(x);

int t = 0;
while (q.size() >= 2) {
int f = q.top(); q.pop();
int s = q.top(); q.pop();
f--; s--; t++;
if (f) q.push(f);
if (s) q.push(s);
}
if (!q.empty()) t += q.top();
return t;
}
};

lc1057 选自行车

piii dist_pq模拟+贪心

pq优先处理最优候选

typedef pair<int, int> PII;
typedef pair<int, PII> PIII;

class Solution {
public:
vector<int> assignBikes(vector<vector<int>>& workers, vector<vector<int>>& bikes) {
int n = workers.size(), m = bikes.size();
priority_queue<PIII, vector<PIII>, greater<PIII>> heap;
vector<int> ans(n, -1);
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
int dist = abs(workers[i][0] - bikes[j][0]) + abs(workers[i][1] - bikes[j][1]);
heap.push({dist, {i, j}});//init
}
}


vector<int> remain(m, 1);
int cnt = 0;
while(cnt < n) {
auto t = heap.top();
heap.pop();
int i = t.second.first, j = t.second.second;
if(remain[j] && ans[i] == -1) {
ans[i] = j;
remain[j] = 0;
cnt++; //choice

}
}
return ans;
}
};

有迪杰斯特拉“贪心+优先队列”的感觉:

迪杰斯特拉是用小根堆每次选“当前最短路径”的节点

这里是用小根堆每次选“当前距离最小的工人-单车对”;两者都是通过优先队列优先处理“最优候选”,再逐步确定最终结果,核心思路是一致的。

不过这个解法有个小问题:它把所有(工人-单车)对都入堆,时间复杂度是 O(nm\log nm)(n 是工人数,m 是单车数),当 n、m 很大时会比较耗时~

还有一种桶排序的tricks

计算距离时,外循环从小到大遍历worker,内循环从小到大遍历bike,然后依次添加到指定桶的末尾,这样同一个桶(距离相同的)的工人自行车对,一定是工人id小的在前,若工人id相同的,则自行车编号小的在前

正好符合题意,后面只需要线性遍历就可以了,省掉了耗时的排序过程

class Solution {
public:
vector<int> assignBikes(vector<vector<int>>& workers, vector<vector<int>>& bikes) {
int n = workers.size(), m = bikes.size();
// 桶的下标是距离,桶内存储 (工人id, 单车id)
vector<vector<pair<int, int>>> buckets(2001);

// 外循环遍历工人(从小到大),内循环遍历单车(从小到大)
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
int dist = abs(workers[i][0] - bikes[j][0]) + abs(workers[i][1] - bikes[j][1]);
buckets[dist].emplace_back(i, j);
}
}

vector<int> ans(n, -1);
vector<bool> bike_used(m, false);
int cnt = 0;

// 按距离从小到大遍历桶
for (int d = 0; d <= 2000 && cnt < n; ++d) {
// 遍历当前距离桶内的所有 (工人, 单车) 对
for (auto& p : buckets[d]) {
int worker_id = p.first;
int bike_id = p.second;
// 工人未分配 且 单车未被用
if (ans[worker_id] == -1 && !bike_used[bike_id]) {
ans[worker_id] = bike_id;
bike_used[bike_id] = true;
cnt++;
if (cnt == n) break;
}
}
}

return ans;
}
};

lc1430

bfs

1.if (i == n - 1)
return !t->left && !t->right;

2.

if (!hasMatch) return false; //cut

class Solution {
public:
bool isValidSequence(TreeNode* root, vector<int>& arr)
{
int n = arr.size();
if (!root) return false;
queue<TreeNode*> q;
q.push(root);

int i = 0;
while (q.size())
{
int sz = q.size();
bool hasMatch = false;
while (sz--)
{
auto t = q.front();
q.pop();

if (arr[i] == t->val)
{
hasMatch = true;
// i是最后一个元素时,必须是叶子节点
if (i == n - 1)
return !t->left && !t->right;


if (t->left) q.push(t->left);
if (t->right) q.push(t->right);
}
}
if (!hasMatch) return false; //cut
i++;
}
return false;
}
};

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 23:37:52

基于EmotiVoice开发互动游戏语音系统的最佳实践

基于EmotiVoice开发互动游戏语音系统的最佳实践 在现代互动游戏中&#xff0c;玩家早已不再满足于“点击对话框→播放录音”的静态交互模式。他们期待的是能感知情绪、回应情境、甚至带有性格的NPC——一个会因愤怒而颤抖、因悲伤而哽咽、因惊喜而语速加快的“活人”。然而&…

作者头像 李华
网站建设 2026/4/20 14:45:37

TLS网络安全协议巩固知识基础题(5)

1. TLS 1.3中的KeyUpdate消息如何实现密钥更新? 触发方式:任一方主动发送KeyUpdate消息 更新类型: update_not_requested:单向密钥更新 update_requested:请求对方也更新密钥 密钥派生:使用HKDF基于当前traffic secret生成新密钥 2. 解释TLS中的Padding扩展及其安全意义?…

作者头像 李华
网站建设 2026/4/22 17:28:48

基于Beego的轻量级功能权限管理系统设计与实现

基于Beego的轻量级功能权限管理系统设计与实现 基于Beego的轻量级功能权限管理系统&#xff1a;毕业设计源码与论文全解析 在当今数字化时代&#xff0c;权限管理系统已成为Web应用开发中不可或缺的核心组件。无论是企业后台管理系统、内部办公平台&#xff0c;还是SaaS服务&…

作者头像 李华
网站建设 2026/4/19 17:09:25

基于Golang与Vue3的全栈博客系统设计与实现

基于Golang与Vue3的全栈博客系统设计与实现 基于Golang与Vue3的全栈博客系统&#xff1a;毕业设计与学习实践的完美解决方案 在当今数字化时代&#xff0c;博客系统不仅是个人表达和知识分享的平台&#xff0c;更是全栈开发技术学习的绝佳案例。对于计算机科学和软件工程专业…

作者头像 李华
网站建设 2026/4/24 2:35:37

紧急缺人!年薪96万的新兴领域,强烈建议冲一冲

大家好&#xff0c;我是程序员小灰。不得不承认&#xff0c;最近一段时间大环境并不好。在互联网全面进入存量竞争、企业纷纷“降本增效”的大背景下&#xff0c;传统开发岗位的HC正在快速收缩……然而&#xff0c;传统程序员降薪、裁员的同时&#xff0c;AI相关技术岗位却在疯…

作者头像 李华
网站建设 2026/4/24 14:08:25

MOS 管栅极的 “充放电控制 + 可靠性

要分析这个UCC27244D 驱动 MOS 管 Q1电路中 R1、R3、D1、R2 的作用,需要结合 “栅极驱动的充放电、振荡抑制、可靠性” 这几个核心需求来看: 1. R1(100Ω):栅极串联电阻(核心作用是抑制振荡 + 限流) R1 串联在驱动器OUTA与 MOS 管 Q1 的栅极(G)之间,是栅极电阻,作…

作者头像 李华