当前位置: 首页 > news >正文

pq|dfs|快排

lc1985

简单题 简单做

上堆/快排也行

按字符串长度降序、长度相同则按字典序降序排序数字字符串数组,返回第 k 大的元素。

class Solution {
public:
string kthLargestNumber(vector<string>& nums, int k) {
sort(nums.begin(), nums.end(),
[](string s1, string s2)->bool
{
if(s1.size() != s2.size()) return s1.size() > s2.size(); //先比字符串的长度
else return s1 > s2;//再比字符串的大小
});
return nums[k - 1];//返回第k个大的
}
};

优先队列

class Solution {
private:
static bool cmp(const string& s1, const string& s2) {
if(s1.length() != s2.length()) return s1.length() < s2.length();
for(int i = 0; i < s1.length(); ++i) {
if(s1[i] != s2[i])
return s1[i] < s2[i];
}
return false;
};
public:
string kthLargestNumber(vector<string>& nums, int k) {
priority_queue<string, vector<string>, decltype(&Solution::cmp)> q(cmp);
for(const auto& s: nums)
q.push(s);
while(!q.empty() && --k)
q.pop();
return q.top();
}
};

快排接口 优雅的比较函数😋

class Solution {
public:
static bool cmp(string s1, string s2) {
return s1.size() != s2.size() ? s1.size() > s2.size() : s1 > s2;
}

string kthLargestNumber(vector<string>& nums, int k)

{
nth_element(nums.begin(), nums.begin() + k - 1, nums.end(), cmp);
return nums[k - 1];
}
};

lc3331

感觉就是当图来做的,注意回溯处理

先建树,DFS回溯维护每个字符的最近祖先,把同字符子节点移到最近祖先下重构树

最后DFS统计每个节点的子树大小

class Solution {
public:
vector<int> findSubtreeSizes(vector<int>& parent, string s) {
int n = parent.size();
vector<vector<int>> g(n);
for (int i = 1; i < n; i++)
g[parent[i]].push_back(i);

int ancestor[26];
ranges::fill(ancestor, -1);
auto rebuild = [&](auto&& rebuild, int x) -> void {
int sx = s[x] - 'a';
int old = ancestor[sx];
ancestor[sx] = x;
for (int i = g[x].size() - 1; i >= 0; i--) {
int y = g[x][i];
int anc = ancestor[s[y] - 'a'];
if (anc != -1) {
g[anc].push_back(y);
g[x][i] = -1; // -1 表示删除 y
}
rebuild(rebuild, y);
}
ancestor[sx] = old; // 恢复现场
};
rebuild(rebuild, 0);

vector<int> size(n, 1); // 注意这里已经把 1 算进去了
auto dfs = [&](auto&& dfs, int x) -> void {
for (int y : g[x]) {
if (y != -1) { // y 没被删除
dfs(dfs, y);
size[x] += size[y];
}
}
};
dfs(dfs, 0);
return size;
}
};


class Solution {
public:
vector<int> findSubtreeSizes(vector<int>& parent, string s) {
int n = parent.size();
vector<vector<int>> g(n);
for (int i = 1; i < n; i++)
g[parent[i]].push_back(i);

vector<int> size(n, 1);
int ancestor[26];
ranges::fill(ancestor, -1);


auto dfs = [&](auto&& dfs, int x) -> void {
int sx = s[x] - 'a';
int old = ancestor[sx];
ancestor[sx] = x;
for (int y : g[x]) {
dfs(dfs, y);
int anc = ancestor[s[y] - 'a'];
size[anc < 0 ? x : anc] += size[y];
}
ancestor[sx] = old; // 恢复现场
};
dfs(dfs, 0);
return size;
}
};

http://www.jsqmd.com/news/135444/

相关文章:

  • 2025最新!8个AI论文软件测评:研究生写论文痛点全解析
  • Dify 本地开发:前端代理转发解决 401 问题
  • 基于SpringBoot家教中介管理系统(毕设源码+文档)
  • 镜像的创建
  • NX ①添加GC工具箱 ②制图绘制中心线 ③制图倒斜角标注C ④更新重量
  • DPJ-141 基于stm32f103控制器的GPRS定位追踪器设计(源代码+proteus仿真)
  • 事后诸葛分析
  • 当AI Agent学会“打电话“——微软Agent Framework的A2A与AGUI协议深度解析
  • AI Ping 赋能:基于 GLM-4.7(免费!)+ LangChain + Redis 打造智能AI聊天助手
  • 2025银川最新装修改造家政服务中心 TOP5 评测!兴庆区、金凤区、西夏区、贺兰县等地区一站式家庭服务机构权威榜单发布,专业高效助力家居焕新 - 全局中转站
  • 软件基础第四次作业
  • 在Django中安装、配备、使用CKEditor5,并将CKEditor5录入的文章展现出来,实现一个简单博客网站的机制
  • 前端 | 一篇搞懂CSS盒模型核心:padding、margin、border与box-sizing、border-radius
  • 基于SpringBoot的足浴管理系统(毕设源码+文档)
  • 共享指针和独占指针
  • 团队作业6——项目事后分析
  • 断点调式
  • 基于SpringBoot高校迎新管理系统(毕设源码+文档)
  • 2025年拼多多代运营公司十大排名榜单 - 前沿公社
  • [MAUI]简单可食用的PopupTResult
  • Hive - SerDe
  • 乌诺地尔vs酮康唑:防脱洗发水怎么选?关键看你的脱发原因 - 速递信息
  • 华为鸿蒙智家新特性推动行业变革,重塑智能家居生态新格局
  • Photoshop进阶基石:“曲线”调色与矢量应用的精髓
  • 收租管理系统软件怎么选?优质公寓管理系统推荐寓盟管家 - 速递信息
  • 二脉通大模型霸屏入选《中国大模型优化领航榜》,成为智能霸屏行业首选! - 品牌智鉴榜
  • 模具设计 | UG软件官方正式版下载与安装教程指南
  • 大数据领域数据服务的数据分析算法应用
  • 2025年AI搜索优化服务商实测榜单:平台覆盖与效果达标率对比 - 速递信息
  • mpv播放器如何快速配置:Windows用户完整入门指南