[leetcode] 周赛 211
比赛题目:https://leetcode-cn.com/circle/discuss/luvHfG/
两个相同字符之间的最长子字符串
开始理解错题意了,结果提交了 2 次错误答案 ️ 。
用一个 map 记录字符出现的第一次位置即可。时间 \(O(n)\),空间 \(O(1)\) 。
class Solution {
public:
int maxLengthBetweenEqualCharacters(string s)
{
int maxval = -1;
unordered_map<char, int> m;
int len = s.length();
for (int i=0; i<len; i++)
{
if (m.count(s[i]) == 1)
maxval = max(maxval, i-m[s[i]]-1);
else
m[s[i]] = i;
}
return maxval;
}
};
带阈值的图连通性
题目:5128. 带阈值的图连通性。
这题看出来是考察并查集的,但是第一次写是通过穷举图中的任意 2 个点是否联通实现的,时间复杂度是 \(O(N^2)\) ,超时了。
class Solution {
public:
vector<int> root;
vector<bool> res;
vector<bool> areConnected(int n, int threshold, vector<vector<int>>& queries)
{
root.resize(n + 1, -1);
for (int i=1; i<=n; i++)
{
for (int j=i+1; j<=n; j++)
{
if (check(n, threshold, j, i))
merge(i,j);
}
}
for (auto &v: queries)
res.push_back(find(v[0]) == find(v[1]));
return res;
}
void merge(int x, int y)
{
x = find(x), y = find(y);
if (x != y) root[y] = x;
}
int find(int x)
{
return root[x] == -1 ? x : (root[x] = find(root[x]));
}
int gcd(int a, int b) // require a >= b
{
return (b == 0) ? a : gcd(b, a % b);
}
bool check(int n, int threshold, int x, int y)
{
return gcd(x, y) > threshold;
}
};
然后也考虑了一下怎么优化,我的第一直觉是从「倍数」关系入手,对于 i 节点,我们只需要看它与 j=2*i, 3*i, 4*i, ... 是否联通。但是仔细一想,不对劲 ,比如 threshold = 2 时,i=6, j=9 这 2 个节点也是联通的,这么做不就忽略这种情况吗?
但其实并没有。
因为 gcd(6, 9) = 3 ,所以其实 6 和 9 在并查集当中通过 3 连起来了。所以通过循环 i=3, j=6,9,... 时,我们已经把这种情况考虑了。
只需要改一下内层循环:
for (int i=1; i<=n; i++)
for (int j=i+i; j<=n; j+=i)
if (check(n, threshold, j, i))
merge(i, j);
实际上 i 可以从 threshold 开始。
空间复杂度 \(O(n)\) 。下面看时间复杂度分析。
首先,双重循环的复杂度是:
问题来了,这里有一个调和级数(真忘记了当时上算法课有没有学过 ️ ),但是高数里边判断是否收敛有个叫积分判别法的东西。所以有(这里的等号并不严谨):
所以双重循坏复杂度是 \(O(n \log n)\),此外,每次循环还包含一次并查集操作,所以总的时间复杂度是 \(O(n \log n \cdot \alpha(n))\) .
无矛盾的最佳球队
题目:5545. 无矛盾的最佳球队。
这 TM 应该是最难的一道题了,看完题解的我还是一脸懵逼。
首先排序,年龄小的在前,同年龄分数小的在前。
那么对于 data[i] ,在其之前的人中(即下面的 data[j] ),跟他没有矛盾的条件是:
- 同一年龄
- 分数小于等于
data[i]的分数
定义 dp[i] 是在区间 [0, i] 上选取人员,且选中人员 i 时最大分数。
转移方程:
有点类似于 LIS ,即最长上升子序列。
class Node
{
public:
int score, age;
Node(int s, int a): score(s), age(a){}
bool operator < (const Node &n) const
{
return age < n.age || (age == n.age && score < n.score);
}
};
class Solution {
public:
int bestTeamScore(vector<int>& scores, vector<int>& ages)
{
int n = scores.size();
vector<Node> data;
for (int i=0; i<n; i++)
data.push_back(Node(scores[i], ages[i]));
sort(data.begin(), data.end());
vector<int> dp(n);
int maxval = data[0].score;
for (int i=0; i<n; i++)
{
dp[i] = data[i].score;
for (int j=0; j<i; j++)
{
if (data[j].age == data[i].age || data[j].score <= data[i].score)
dp[i] = max(dp[i], dp[j] + data[i].score);
}
maxval = max(maxval, dp[i]);
}
return maxval;
}
};
还有一题是:5544. 执行操作后字典序最小的字符串,都说穷举(我也想到了),但就是写不出来,我是傻逼。
就这样吧,不要太难为自己 2333 。
[leetcode] 周赛 211的更多相关文章
- 【Leetcode周赛】从contest-111开始。(一般是10个contest写一篇文章)
Contest 111 (题号941-944)(2019年1月19日,补充题解,主要是943题) 链接:https://leetcode.com/contest/weekly-contest-111 ...
- 【LeetCode】211. Add and Search Word - Data structure design 添加与搜索单词 - 数据结构设计
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:Leetcode, 力扣,211,搜索单词,前缀树,字典树 ...
- 拼写单词[哈希表]----leetcode周赛150_1001
题目描述: 给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars. 假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我 ...
- 【Leetcode周赛】从contest-41开始。(一般是10个contest写一篇文章)
Contest 41 ()(题号) Contest 42 ()(题号) Contest 43 ()(题号) Contest 44 (2018年12月6日,周四上午)(题号653—656) 链接:htt ...
- 【Leetcode周赛】从contest-51开始。(一般是10个contest写一篇文章)
Contest 51 (2018年11月22日,周四早上)(题号681-684) 链接:https://leetcode.com/contest/leetcode-weekly-contest-51 ...
- 【Leetcode周赛】从contest-71开始。(一般是10个contest写一篇文章)
Contest 71 () Contest 72 () Contest 73 (2019年1月30日模拟) 链接:https://leetcode.com/contest/weekly-contest ...
- 【Leetcode周赛】从contest-81开始。(一般是10个contest写一篇文章)
Contest 81 (2018年11月8日,周四,凌晨) 链接:https://leetcode.com/contest/weekly-contest-81 比赛情况记录:结果:3/4, ranki ...
- 【Leetcode周赛】从contest-91开始。(一般是10个contest写一篇文章)
Contest 91 (2018年10月24日,周三) 链接:https://leetcode.com/contest/weekly-contest-91/ 模拟比赛情况记录:第一题柠檬摊的那题6分钟 ...
- 【Leetcode周赛】从contest-121开始。(一般是10个contest写一篇文章)
Contest 121 (题号981-984)(2019年1月27日) 链接:https://leetcode.com/contest/weekly-contest-121 总结:2019年2月22日 ...
随机推荐
- git多账号使用
1 背 景 在公司上班的员工会同时拥有两个git账号, 一个是公司内部的, 仅允许工作时使用; 另一个是个人的, 常用于日常的学习记录. 此时, 面临的问题是如何在一台电脑(客户端)上正常使用两个账号 ...
- 两年银行经验的阿里、头条社招面经分享(已拿offer)
lz是非科班自学的java,毕业后进入卡中心,现在是2年开发经验.20年年初先后面了头条.拼多多和阿里(淘宝和支付宝),并成功拿到阿里和头条两家的offer. 面试前我主要是在牛客网看大家的面经进 ...
- python常用sys模块
sys.argv 命令行参数List,第一个元素是程序本身路径 sys.modules.keys() 返回所有已经导入的模块列表 sys.exc_info() 获取当前正在处理的异常类,exc_typ ...
- vulnhub靶机之Quaoar
Quaoar 靶机非常简单. 扫描端口主机. wordpress建站. 扫到两个用户,分别是wpuser以及admin. 爆破出了后台: 传了一个一句话木马,连上蚁剑又传了个反弹shell. 反弹sh ...
- vulnhub靶机Os-hackNos-1
vulnhub靶机Os-hackNos-1 信息搜集 nmap -sP 192.168.114.0/24 找到开放机器192.168.114.140这台机器,再对这台靶机进行端口扫描. 这里对他的端口 ...
- 跟我一起学.NetCore之Swagger让前后端不再烦恼及界面自定义
前言 随着前后端分离开发模式的流行,接口对接.联调成为常事,前端同事会经常问:我需要调哪个接口?这个接口数据格式是啥?条件都传啥? 对于一些紧急接口可能会采取沟通对接,然后补文档,其他的都会回一句:看 ...
- idea模拟前端向后台请求数据输出响应结果
tools-httpClient-Test restful web service 通过上述步骤之后出现如下图 1 表示通过哪种方式请求:2 请求数据的地址头部:3 请求数据的除了头部之后的地址:4, ...
- springmvc 源码分析(二)-- DiapartcherServlet核心调用流程分析
测试环境搭建: 本次搭建是基于springboot来实现的,代码在码云的链接:https://gitee.com/yangxioahui/thymeleaf.git 项目结构代码如下: 一: cont ...
- Go-变量-var
什么是变量? 一种抽象,计算机用来保存现实数据的容器,通过这个变量抽象可以写入现实数据到计算机中,并且可以读取变量取到保存到计算机中的现实数字化数据 Go-变量定义 关键字 var 关键符号 := i ...
- Java知识系统回顾整理01基础01第一个程序02命令行格式编译和执行Java程序
一.先看运行效果 在控制台下运行第一个Java程序,可以看到输出了字符串 hello world 二.准备项目目录 通常都会在e: 创建一个project目录 在这个例子里,我们用的是e:/proje ...