比赛题目:https://leetcode-cn.com/circle/discuss/luvHfG/

两个相同字符之间的最长子字符串

题目:5543. 两个相同字符之间的最长子字符串

开始理解错题意了,结果提交了 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)\) 。下面看时间复杂度分析。

首先,双重循环的复杂度是:

\[\sum_{i=1}^{n}\frac{n}{i} = n \sum_{i=1}^{n}\frac{1}{i} \]

问题来了,这里有一个调和级数(真忘记了当时上算法课有没有学过 ️ ),但是高数里边判断是否收敛有个叫积分判别法的东西。所以有(这里的等号并不严谨):

\[\sum_{i=1}^{n}\frac{1}{i} = \int_{1}^{n} \frac{1}{x}dx = \ln{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 时最大分数。

转移方程:

\[dp[i] = max(score[i], score[i] + dp[j]), 0 \le j < 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的更多相关文章

  1. 【Leetcode周赛】从contest-111开始。(一般是10个contest写一篇文章)

    Contest 111 (题号941-944)(2019年1月19日,补充题解,主要是943题) 链接:https://leetcode.com/contest/weekly-contest-111 ...

  2. 【LeetCode】211. Add and Search Word - Data structure design 添加与搜索单词 - 数据结构设计

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:Leetcode, 力扣,211,搜索单词,前缀树,字典树 ...

  3. 拼写单词[哈希表]----leetcode周赛150_1001

    题目描述: 给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars. 假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我 ...

  4. 【Leetcode周赛】从contest-41开始。(一般是10个contest写一篇文章)

    Contest 41 ()(题号) Contest 42 ()(题号) Contest 43 ()(题号) Contest 44 (2018年12月6日,周四上午)(题号653—656) 链接:htt ...

  5. 【Leetcode周赛】从contest-51开始。(一般是10个contest写一篇文章)

    Contest 51 (2018年11月22日,周四早上)(题号681-684) 链接:https://leetcode.com/contest/leetcode-weekly-contest-51 ...

  6. 【Leetcode周赛】从contest-71开始。(一般是10个contest写一篇文章)

    Contest 71 () Contest 72 () Contest 73 (2019年1月30日模拟) 链接:https://leetcode.com/contest/weekly-contest ...

  7. 【Leetcode周赛】从contest-81开始。(一般是10个contest写一篇文章)

    Contest 81 (2018年11月8日,周四,凌晨) 链接:https://leetcode.com/contest/weekly-contest-81 比赛情况记录:结果:3/4, ranki ...

  8. 【Leetcode周赛】从contest-91开始。(一般是10个contest写一篇文章)

    Contest 91 (2018年10月24日,周三) 链接:https://leetcode.com/contest/weekly-contest-91/ 模拟比赛情况记录:第一题柠檬摊的那题6分钟 ...

  9. 【Leetcode周赛】从contest-121开始。(一般是10个contest写一篇文章)

    Contest 121 (题号981-984)(2019年1月27日) 链接:https://leetcode.com/contest/weekly-contest-121 总结:2019年2月22日 ...

随机推荐

  1. TP6.0 一对一模型关联 hasOne

    本文测试关联方法都采用预载入查询 $data = User::with('profile')->select(); halt($data->toArray()); 1. 创建数据表 -- ...

  2. TKE基于弹性网卡直连Pod的网络负载均衡

    前言 Kubernetes在集群接入层设计并提供了两种原生资源Service和Ingress,分别负责四层和七层的网络接入层配置. 传统的做法是创建Ingress或LoadBalancer类型的Ser ...

  3. 二、loadrunner参数化连接数据库

    2.连接sqlserver数据库.oracle数据库或mysql数据库(只有mysql数据库驱动需要先手动安装) 2.1.新建一个参数,随便设置file还是table类型之类的 2.2.点击Data ...

  4. jenkins 下载插件失败 有效的处理办法(亲测)

    jenkins 下载插件失败,提示: java.io.IOException: Downloaded file /app/jenkins_home/plugins/jacoco.jpi.tmp doe ...

  5. 使用Java Stream,提取集合中的某一列/按条件过滤集合/求和/最大值/最小值/平均值

    不得不说,使用Java Stream操作集合实在是太好用了,不过最近在观察生产环境错误日志时,发现偶尔会出现以下2个异常: java.lang.NullPointerException java.ut ...

  6. Java Object类方法解析

    Java Object类方法解析 在Java中Object是所有类的父类,任何类都默认继承Object,其提供的方法主要有以下几种: registerNatives() hashCode和equale ...

  7. c语言之结构

    定义结构: struct point { int x; int y; }; 定义结构并声明变量: struct point { int x; int y; }pt1,pt2,pt3; 声明结构变量 s ...

  8. elasticsearch备份和还原(基于hdfs)

    备份和还原,为什么elasticsearch还需要备份呢,明明可以设置副本做到高可用,那怕啥呢? 其实在实际的生产环境中,一般最终的结果数据都是要备份的,这样的做的目的,就是能够以最快的速度还原数据, ...

  9. Oracle学习(十七)数据库锁在分布式系统里的应用(老板,乐观锁了解一下?~)

    一.引言 随着业务量的增加,单机部署已经无法满足日常需求了,我们可能会把代码部署到多台服务器上去来进行服务的扩容,也就是负载均衡,那在这种场景下,怎么能实现锁的概念呢? 那么我们知道如果是一台主机部署 ...

  10. 《Netty权威指南》笔记

    第1章 Java的I/O演进之路 1.1 Linux网络I/O模型 fd:file descriptor,文件描述符.linux内核将所有外部设备都看作一个文件来操作,对文件的读写会调用内核提供的命令 ...