5436. 一维数组的动态和

  • 时间复杂度:O(n)
  • 知识点:前缀和

根据题目给出的公式 runningSum[i] = sum(nums[0]…nums[i]),可得:

  • 当 i > 0 时,runningSum[i] = runningSum[i-1] + nums[i]
  • 当 i = 0 时,runningSum[i] = nums[i]
class Solution {
public:
vector<int> runningSum(vector<int>& nums) {
for(int i = 1;i < nums.size();++i)nums[i] += nums[i - 1];
return nums;
}
};

5437. 不同整数的最少数目

  • 时间复杂度:O(n*logn)
  • 知识点:哈希,排序,贪心

如果要删除 K 个数之后,剩余的数字种类最少

那么就要移除尽可能多的类型的数字,

那么就是要先删除那些出现次数最少的那些数字咯。

可以先统计每个数字出现的次数,然后对次数进行升序排序,然后尝试删除头部的数字即可。

class Solution {
public:
int findLeastNumOfUniqueInts(vector<int>& arr, int k) {
unordered_map<int,int>hash;
int len = arr.size();
for(int i = 0;i < len;++i)hash[arr[i]]++;
vector<int>num;
for(auto it : hash)num.push_back(it.second);
sort(num.begin(),num.end());
int m = num.size();
int ans = m;
for(int i = 0;i < m;++i){
if(k >= num[i]){
--ans;
k -= num[i];
}else break;
}
return ans;
}
};

5438. 制作 m 束花所需的最少天数

  • 时间复杂度:O(n*logm)。n为花的数量,m为1e9。
  • 知识点:二分

首先最暴力的解法,从 1 开始暴力枚举天数 i ,然后检查前 i 天盛开的花是否能满足需求。这样的时间复杂度是 O(n*m)。

不难发现,如果第 i 天可以满足要求,那么第 i 天之后盛开的花肯定也能满足需求。

也就是说,答案具备二分的前置要求——单调性。

接下来我们通过二分找到一个最小的 i,使其满足[0, i-1) 天盛开的花不能满足需求,[i, +∞) 天盛开的花都能满足需求。

如果不存在这样的 i,那么答案就是 -1。

设答案可能的取值范围为 [1, 1e9]。首先判断(1+1e9)/2 是否能满足需求。

  • 如果不能,说明答案不可能在[1, (1+1e9)/2] 中。
  • 如果能,说明答案不可能在 ((1+1e9)/2), 1e9] 中。

依此类推,每次检查都能排除掉一半的候选值。所以做多需要检查约 30 次,即log(1e9) 次。

class Solution {
public:
bool ok(int mid,vector<int>& b,int m,int k){
int cnt = 0,num = 0;
for(int i = 0;i < b.size();++i){
if(b[i] <= mid)num++;
else num = 0;
if(num == k)++cnt,num = 0;
if(cnt == m)return true;
}
return false;
}
int minDays(vector<int>& b, int m, int k) {
int n = b.size();
if(n < m * k)return -1;
int l = 0,r = 1e9;
while(l < r){
int mid = l + r >> 1;
if(ok(mid,b,m,k)) r = mid;
else l = mid + 1;
}
return l;
}
};

5439. 树节点的第 K 个祖先

这道题没接触过就没写了,赛后才知道是树的遍历 + 倍增

学习评论区大佬的解法

  • 时间复杂度:O(n*logn)
  • 知识点:树的遍历,倍增

  • 如果通过预处理,可以知道每个节点的第 1,2,4,8,16…个祖先节点。那么对于每次询问,最多只会向上跳log(n)次。

    如上图所示,每个点最多会建立logn条向上的边。以寻找结点5的第5个祖先为例,可以转化为寻找结点1的第1个祖先,再转化为寻找结点0个第0个祖先,即结点0。

倍增建边过程:

如果结点 i 个所有祖先结点已经建边完成,那么可以询问 i 个第 1,2,4,8,16 … 个祖先结点,直到其某个祖先节点不存在。对于每次询问利用祖先结点已经建好的边可以O(logn)的时间复杂度完成。所以可以按照先序遍历的顺序来进行建边。

class TreeAncestor {
vector<int> anc[50000];
bool mark[50000];
void dfs(const vector<int> &parent, int id) {
if(parent[id] == -1 || mark[id] == true) {
return;
}
dfs(parent, parent[id]);
for(int i = 1; ; i <<= 1) {
int p = getKthAncestor(parent[id], i-1);
if(p == -1) {
break;
}
anc[id].push_back(p);
}
mark[id] = true;
}
public:
TreeAncestor(int n, vector<int>& parent) {
memset(mark, false, sizeof(bool)*n);
for(int i = 0; i < n; i++) {
dfs(parent, i);
}
} int getKthAncestor(int node, int k) {
if(node == -1) {
return -1;
}
if(k == 0) {
return node;
}
if(node == 0) {
return -1;
}
int i = 1, pos = 0;
while(i*2 <= k && pos+1 < anc[node].size()) {
i *= 2;
pos++;
}
return getKthAncestor(anc[node][pos], k-i);
}
}; /**
* Your TreeAncestor object will be instantiated and called as such:
* TreeAncestor* obj = new TreeAncestor(n, parent);
* int param_1 = obj->getKthAncestor(node,k);
*/

LeetCode 第 193 场周赛 解题报告的更多相关文章

  1. Leetcode 第133场周赛解题报告

    今天参加了leetcode的周赛,算法比赛,要求速度比较快.有思路就立马启动,不会纠结是否有更好的方法或代码可读性.只要在算法复杂度数量级内,基本上是怎么实现快速就怎么来了. 比赛时先看的第二题,一看 ...

  2. Leetcode 第137场周赛解题报告

    今天的比赛的题目相对来说比较「直白」,不像前几周都是一些特定的算法,如果你没学过不可能想出来. 做了这些周,对leetcode比赛的题目也发现了一些「规律」. 一般前两道题都很「简单」,只要有想法,直 ...

  3. Leetcode 第136场周赛解题报告

    周日的比赛的时候正在外面办事,没有参加.赛后看了下题目,几道题除了表面要考的内容,还是有些能发散扩展的地方. 做题目不是最终目的,通过做题发现知识盲区,去研究学习,才能不断提高. 理论和实际是有关系的 ...

  4. Leetcode 第135场周赛解题报告

    这周比赛的题目很有特点.几道题都需要找到一定的技巧才能巧妙解决,和以往靠数据结构的题目不太一样. 就是如果懂原理,代码会很简单,如果暴力做,也能做出来,但是十分容易出错. 第四题还挺难想的,想了好久才 ...

  5. LeetCode 2 Add Two Sum 解题报告

    LeetCode 2 Add Two Sum 解题报告 LeetCode第二题 Add Two Sum 首先我们看题目要求: You are given two linked lists repres ...

  6. LeetCode 第 165 场周赛

    LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能 ...

  7. Leetcode第 217 场周赛(思维量比较大)

    Leetcode第 217 场周赛 比赛链接:点这里 做完前两题我就知道今天的竞赛我已经结束了 这场比赛思维量还是比较大的. 1673. 找出最具竞争力的子序列 题目 给你一个整数数组 nums 和一 ...

  8. 【LeetCode】376. Wiggle Subsequence 解题报告(Python)

    [LeetCode]376. Wiggle Subsequence 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.c ...

  9. 【LeetCode】649. Dota2 Senate 解题报告(Python)

    [LeetCode]649. Dota2 Senate 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地 ...

  10. 【LeetCode】911. Online Election 解题报告(Python)

    [LeetCode]911. Online Election 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ ...

随机推荐

  1. 《HelloGitHub》第 92 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...

  2. Excel表格存在不同大小的合并单元格怎么排序?

    当Excel表格中存在不同大小的合并单元格时,进行排序可能会出现一些难题.因为合并单元格会影响数据的布局,导致排序结果不符合预期. 下面我将详细介绍如何在包含不同大小合并单元格的Excel表格中进行排 ...

  3. 多维度分析数据的软件,BI软件不就是吗

    BI软件(Business Intelligence Software)是一种用于多维度分析数据的工具,可以帮助企业从海量数据中提取有价值的洞察力,并为决策者和业务用户提供可视化.交互式的报表和仪表盘 ...

  4. WinForm遍历控件

    1 foreach (Control c in this.Controls) 2 { 3 if (c is TextBox) 4 ((TextBox)c).Text = "1111" ...

  5. Gradle导致Lombok不生效问题

    现象 从debug看是可以查询到数据的,但是返回起前端是没有数据的 解决办法 // 引入lombok注解处理器 annotationProcessor,不然lombok不会生效 annotationP ...

  6. 后端程序员必会的前端知识-03:Vue2

    三. Vue 2 1. Vue 基础 1) 环境准备 安装脚手架 npm install -g @vue/cli -g 参数表示全局安装,这样在任意目录都可以使用 vue 脚本创建项目 创建项目 vu ...

  7. ceph集群搭建详细教程(ceph-deploy)

    ceph-deploy比较适合生产环境,不是用cephadm搭建.相对麻烦一些,但是并不难,细节把握好就行,只是命令多一些而已. 实验环境 服务器主机 public网段IP(对外服务) cluster ...

  8. 2023-08-18:用go写算法。你会得到一个字符串 text, 你应该把它分成 k 个子字符串 (subtext1, subtext2,…, subtextk)。 要求满足: subtexti 是

    2023-08-18:用go写算法.你会得到一个字符串 text, 你应该把它分成 k 个子字符串 (subtext1, subtext2,-, subtextk). 要求满足: subtexti 是 ...

  9. 文心一言 VS 讯飞星火 VS chatgpt (62)-- 算法导论6.5 1题

    文心一言 VS 讯飞星火 VS chatgpt (62)-- 算法导论6.5 1题 一.试说明 HEAP-EXTRACT-MAX在堆A=(15,13,9,5,12,8,7,4,0,6,2,1)上的操作 ...

  10. 能够让机器狗学会灭火, ModelArts3.0让AI离我们又近一步

    摘要:训练.标注成本节省90%!华为云自动化AI开发平台ModelArts 3.0发布,从训练数据到模型落地一站式打通. 今年的华为,着实遭遇了不小的困难. 尤其是供应链,包括芯片方面的打击,让华为轮 ...