LeetCode周赛#204 题解
1566. 重复至少 K 次且长度为 M 的模式 #模拟
题目链接
题意
给定正整数数组 arr,请你找出一个长度为 m 且在数组中至少重复 k 次的模式。
模式 是由一个或多个值组成的子数组(连续的子序列),连续 重复多次但 不重叠 。 模式由其长度和重复次数定义。如果数组中存在至少重复 k 次且长度为 m 的模式,则返回 true ,否则返回 false 。
分析
题目初看有点麻烦,但实际上隔着特定周期(即重复长度)去检查相应字符是否相等,模拟一下题意即可。
class Solution {
public:
bool containsPattern(vector<int>& arr, int m, int k) {
int cnt = 0; //统计重复度(次数)
int len = arr.size();
int tmp = 0; //计算当前重复长度
for (int i = 0; i < len; i++){
if(tmp == m){ //达到重复长度,答案+1
cnt++;
tmp = 0; //重复长度归零
}
if(i + m >= len) break; //越界
if(arr[i] == arr[i + m]) tmp++;
else{ //字符不匹配
if(cnt >= k - 1) return true;
cnt = 0; tmp = 0;
}
}
return cnt >= k - 1;
}
};
1567. 乘积为正数的最长子数组长度 #贪心
题目链接
题意
给定整数数组 nums ,请你求出乘积为正数的最长子数组的长度。其中,一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。
分析
我的版本(代码略长)
class Solution {
public:
int getMaxLen(vector<int>& nums) {
int len = nums.size();
int cnt = 0, mymax = -0x3f3f3f3f;
bool last = false; //记录前面遍历过的序列中是否存在负数
/*从左至右遍历*/
for (int i = 0; i < len; i++){
cnt++;
if(nums[i] == 0){
cnt = 0; last = false;
}
else if(nums[i] < 0){
if(last == false) last = true; //如果前面遍历过的序列中并没有过剩的负数
else last = false;
}
if(last == false) mymax = max(mymax, cnt); //只有当前面的负号全消掉的时候方能更新答案
}
/*从右至左遍历*/
cnt = 0; last = false;
for(int i = len - 1; i >= 0; i--){
cnt++;
if(nums[i] == 0){
cnt = 0; last = false;
}
else if(nums[i] < 0){
if(last == false) last = true;
else last = false;
}
if(last == false) mymax = max(mymax, cnt);
}
return (mymax == -0x3f3f3f3f) ? cnt - 1 : mymax; //避免全为负数
}
};
\(@xu012\)的队列版本,易写,不过复杂度有点高
class Solution {
public:
int getMaxLen(vector<int>& nums) {
int len = nums.size();
int last = -1, ans = -1;
queue<int> myque; //队列存放负数位置
for (int i = 0; i < len; i++){
if(nums[i] == 0){ //遇到0即隔断
last = i;
queue<int> tmp;
myque.swap(tmp); //清空队列
}
else if(nums[i] < 0) myque.push(i);
if(myque.size() % 2 == 0)
ans = max(ans, i - last); //当前数字下标-上一个0的下标
else
ans = max(ans, i - myque.front());
}
return ans;
}
};
1569. 将子数组重新排序得到同一个二叉查找树的方案数 #分治 #组合数
题目链接
题意
给定数组 nums表示 1 到 n 的一个排列。按照元素在nums中的顺序依次插入一个初始为空的二叉查找树。请你统计将 nums 重新排序后,统计满足如下条件的方案数:重排后得到的二叉查找树与 nums 原本数字顺序得到的二叉查找树相同,将结果对 10^9 + 7 取余数。
样例

分析
显然第一个插入的元素必为根节点,设为rt,通过rt的大小,我们就能决定数组后面的元素如何划分至左右子树。我们设lo表示小于rt的元素构成的集合,hi表示大于rt元素集合,显然lo、hi分别代表左、右子树节点集。
观察到,无论我先从lo集合中取元素插入rt左子树,还是我先从hi集合取元素插入右子树,树的拓扑结构并不影响,简单来说,两个大集合谁先谁后插入搜索树中,都不会发生相互影响。
那么,集合内部的元素插入顺序是否影响呢?我们回想第一句话,第一个插入元素必为根节点。改变了第一个插入的元素,就会使得新树的结构不再于给定的原树结构相同了。
我们只要保证左子树的元素内部相对顺序,以及右子树的元素内部相对顺序,调整两种集合的插入顺序,能够获得新插入序列,但不影响原树的结构。
如何统计?从n个元素中将k个元素(均属于某一集合)挑选出来,同时保证这k个元素相对顺序相同(需要去序),共有\(C^{k}_n\)(或\(C^{lo.size}_{lo.size+hi.size}\))个组合。当然我们只是将两个大集合的组合统计了,大集合内部同样有如此的统计方式,由乘法原理得到\(f(n) = f(lo)\times f(hi) \times C^{lo.size}_{lo.size+hi.size}\)
typedef long long ll;
ll c[1010][1010];
class Solution {
private:
const int MOD = 1e9+7;
public:
void Calculate(int len){ //预计算组合数公式
for(int i = 1; i <= len; i++){
c[i][0] = c[i][i] = 1;
for(int j = 1; j < i; j++)
c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % MOD;
} //递推过程类似于01背包
}
int dfs(vector<int>& arr){
vector<int> lo, hi;
if(arr.size() <= 1) return 1;
for (int i = 1; i < (int)arr.size(); i++){
if(arr[i] < arr[0]) lo.push_back(arr[i]);
else hi.push_back(arr[i]);
} //划分左右子树
ll cur = c[lo.size() + hi.size()][lo.size()];
cur = (cur * dfs(lo)) % MOD;
cur = (cur * dfs(hi)) % MOD;
return cur % MOD;
}
int numOfWays(vector<int>& nums) {
Calculate(nums.size());
return (dfs(nums) - 1 + MOD) % MOD; //记得-1
}
};
1568. 使陆地分离的最少天数 #Tarjan求割点
题目链接
题意
给你一个由若干 0 和 1 组成的二维网格 grid ,其中 0 表示水,而 1 表示陆地。岛屿由水平方向或竖直方向上相邻的 1 (陆地)连接形成。
如果 恰好只有一座岛屿 ,则认为陆地是 连通的 ;否则,陆地就是 分离的 。一天内,可以将任何单个陆地单元(1)更改为水单元(0)。现要求使陆地分离的最少天数。

分析
Tarjan割点的算法我还没学,暂时先咕
其实该题有个漏洞,所有岛屿都有小边角,只要将小边角切出一块即可,也就说最多天数为2。
LeetCode周赛#204 题解的更多相关文章
- Leetcode 周赛#202 题解
本周的周赛题目质量不是很高,因此只给出最后两题题解(懒). 1552 两球之间的磁力 #二分答案 题目链接 题意 有n个空篮子,第i个篮子位置为position[i],现希望将m个球放到这些空篮子,使 ...
- LeetCode周赛#203 题解
1561. 你可以获得的最大硬币数目 #贪心 题目链接 题意 有 3n 堆数目不一的硬币,你和你的朋友们打算按以下方式分硬币: 每一轮中,你将会选出 任意 3 堆硬币(不一定连续). Alice 将会 ...
- Leetcode 周赛#201 题解
1545 找出第N个二进制字符串的第K位 #分治 题目链接 题意 给定正整数\(n(\leq 20)\)与\(k\),二进制串\(S_n\)形成规则有: \(S_1 = "0"\) ...
- Leetcode 周赛#200 题解
1535 找出数组游戏的赢家 #模拟+优化 题目链接 题意 给你一个由 不同 整数组成的整数数组 arr 和一个整数 k(\(1\leq k\leq1e9\)) .每回合游戏都在数组的arr[0] 和 ...
- LeetCode双周赛#33 题解
5480. 可以到达所有点的最少点数目 #贪心 题目链接 题意 给定有向无环图,编号从0到n-1,一个边集数组edges(表示从某个顶点到另一顶点的有向边),现要找到最小的顶点集合,使得从这些点出发, ...
- Leetcode 双周赛#32 题解
1540 K次操作转变字符串 #计数 题目链接 题意 给定两字符串\(s\)和\(t\),要求你在\(k\)次操作以内将字符串\(s\)转变为\(t\),其中第\(i\)次操作时,可选择如下操作: 选 ...
- 【Leetcode周赛】从contest-111开始。(一般是10个contest写一篇文章)
Contest 111 (题号941-944)(2019年1月19日,补充题解,主要是943题) 链接:https://leetcode.com/contest/weekly-contest-111 ...
- 【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 ...
随机推荐
- socket 参考文档
socket.io 中文手册,socket.io 中文文档转载于:http://www.cnblogs.com/xiezhengcai/p/3956401.html 服务端 io.on('connec ...
- JUC---09异步回调
一.相关概念 Java的过程是阻塞的,因此要实现异步回调,需要多线程的支持.要实现回调,B函数在不知道A函数具体实现的情况下能够调用A函数,这是一种多态,需要接口来实现.下面实现一个简单的Java回调 ...
- GoSDK的安装及环境变量配置 入门详解 - 精简归纳
GoSDK的安装及环境变量配置 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 29 转载请注明出处!️ 目录 GoSDK的安装及环境变量配置 入门详解 - 精简归纳 一.进入G ...
- 4G DTU和4G工业路由器有哪些区别?
DTU的英文全称是Data Transfer unit,是一种专门用来将将IP数据转换为串口数据或者是将串口数据转换为IP数据并且通过无线通信网络将数据进行传送的无线终端设备.DTU也可以实现无线网络 ...
- Yii2使用数据库操作汇总(增删查改、事务)
查询 //1.简单查询 $admin=Admin::model()->findAll($condition,$params); $admin=Admin::model()->findAll ...
- [CF160D]Edges in MST (最小生成树+LCA+差分)
待填坑 Code //CF160D Edges in MST //Apr,4th,2018 //树上差分+LCA+MST #include<cstdio> #include<iost ...
- mns: Money Never Sleeps! 自己开发的一款 IDEA 插件介绍.
一边敲代码, 一边关注股票/基金行情, 还不怕同事盯到自己的屏幕! 对于一个关注股市跟基金的研发人员来说, 莫过于一天到晚写代码, 而不能及时的查看股市行情跟基金走势了吧. 写代码的时候比较容易忘记看 ...
- Java进阶专题(十六) 数据结构与算法的应用(上)
前言 学习算法,我们不需要死记硬背那些冗长复杂的背景知识.底层原理.指令语法--需要做的是领悟算法思想.理解算法对内存空间和性能的影响,以及开动脑筋去寻求解决问题的最佳方案.相比编程领域的其他技术 ...
- 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)
再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...
- .NET Core 跨平台资源监控库及 dotnet tool 小工具
目录 简介 dotnet tool 体验 CZGL.SystemInfo SystemPlatformInfo ProcessInfo 内存监控 NetworkInfo DiskInfo 简介 CZG ...