感谢又给一次AK的机会,AK传送门

文章目录

  • 强密码检验器 II
  • 咒语和药水的成功对数
  • 替换字符后匹配
  • 统计得分小于 K 的子数组数目

强密码检验器 II

题目


思路

  • 根据题意模拟即可

代码

class Solution {public:bool strongPasswordCheckerII(string p) {int n = p.size();if(n < 8) return false;string s = "!@#$%^&*()-+";bool o1 = true, o2 = true, o3 = true, o4 = true, o5 = true;for (int i = 0; i < n; i++) {if(p[i] <= 'z' && p[i] >= 'a') o1 = false;if(p[i] <= 'Z' && p[i] >= 'A') o2 = false;if(p[i] <= '9' && p[i] >= '0') o3 = false;for (int j = 0; j < s.size(); j++) if(s[j] == p[i]) o4 = false;if(i && p[i] == p[i - 1]) o5 = false;}return !o1 && !o2 && !o3 && !o4 && o5;}
};

咒语和药水的成功对数

题目


思路

计算 s p e l l s [ i ] ∗ p o t i o n s [ j ] > = s u c c e s s {spells[i] * potions[j] >= success} spells[i]∗potions[j]>=success ,每个 i {i} i 有多少个 j {j} j 满足。

转化为找到 s p e l l s [ i ] > = s u c c e s s / p o t i o n s [ j ] spells[i] >= success \ / \ potions[j] spells[i]>=success / potions[j],有多少个 j {j} j 满足。

那么此时我们可以新开数组 a [ j ] a[j] a[j] 用以表示 s u c c e s s / p o t i o n s [ j ] success \ / \ potions[j] success / potions[j]

由于在此是大于等于才满足条件(也即 a [ j ] < = s p e l l s [ i ] a[j]<=spells[i] a[j]<=spells[i]),那么我们将 a a a 数组存储上取整的值: ( s u c c e s s − 1 ) / p o t i o n s [ j ] + 1 (success-1) \ / \ potions[j] + 1 (success−1) / potions[j]+1。

相当于是找到 a [ j ] < s p e l l s [ i ] a[j] < spells[i] a[j]<spells[i] 的 j j j 的个数,此时我们将 a a a 数组升序排列,可以用二分查找临界位置。

  • 最终结果: r e s [ i ] = u p p e r _ b o u n d ( a . b e g i n ( ) , a . e n d ( ) , s p e l l s [ i ] ) − a . b e g i n ( ) ; res[i]=upper\_bound(a.begin(), a.end(), spells[i]) - a.begin(); res[i]=upper_bound(a.begin(),a.end(),spells[i])−a.begin();

代码

class Solution {public:vector<int> successfulPairs(vector<int>& spells, vector<int>& potions, long long success) {vector<int> res;vector<long long> a;for (int i = 0; i < potions.size(); i++) {a.push_back(1ll * (success - 1) / potions[i] + 1);}sort(a.begin(), a.end());for (int i = 0; i < spells.size(); i++) {int id = upper_bound(a.begin(), a.end(), spells[i]) - a.begin();res.push_back(id);}return res;}
};

替换字符后匹配

题目


思路

  • 比赛的时候想歪了,以为是一道难的算法题,还想着怎么建边搜。

其实我们看数据发现, 5000 5000 5000 的字符串长度 ,大概 n 2 n^2 n2 也就是 3 e 7 3e7 3e7,加上中间字符串的匹配操作,卡个极限时间能过。

  • 从左向右遍历 s s s ,以每个位置 i i i 为起始,向后的 s u b . s i z e ( ) sub.size() sub.size() 长度的子串,去与 s u b sub sub 进行比对。
  • 遍历 s u b sub sub,如果当前字符 s u b [ j ] sub[j] sub[j] 可以换为对应位的 s s s 的子串字符,直到所有 j j j 都满足,那么即可以将 s u b sub sub 变为 s s s 的子串

细节详见代码部分


代码

class Solution {public:map<char, map<char, bool>> mp;bool matchReplacement(string s, string sub, vector<vector<char>>& mappings) {int n = s.size(), m = sub.size();if(m > n) return false;for (int i = 0; i < mappings.size(); i++) {char a = mappings[i][0], b = mappings[i][1];mp[a][b] = true;}for (int i = 0; i < n - m + 1; i++) {string pre = s.substr(i, m);bool o = true;for (int j = 0; j < m; j++) {if(!mp[sub[j]][pre[j]] && sub[j] != pre[j]) o = false;if(!o) break;}if(o) return true;}return false;}
};
  • 补题学到的妙解

s u f suf suf 数组存储最终每个字符所有能转移到的状态

最终结果就是取 s u b sub sub 中每个字符状态的并集

  • 参考这位大佬

位运算加速,代码如下:

class Solution {public:static const int N = 5010;bitset<N> res, pre[128], suf[128]; bool matchReplacement(string s, string sub, vector<vector<char>>& mappings) {for (int i = 0; i < 128; i++) pre[i].reset();for (int i = 0; i < s.size(); i++) pre[s[i]].set(i);for (int i = 0; i < 128; i++) suf[i] = pre[i];for (auto &mp: mappings) suf[mp[0]] |= pre[mp[1]];res.set();for (int i = 0; i < sub.size(); i++) res &= suf[sub[i]] >> i;return res.count();}
};

统计得分小于 K 的子数组数目

题目


思路

  • 比较容易能发现一个性质,单调性, 即子数组越长,那么分数越高。

由此我们可以想到有双指针来解决,(应该可以吧hhh

  • l , r l,r l,r 维护区间左右,当前区间表示一定满足分数 < k < k <k 的情况。

那么如何计算上每个状态的贡献呢?

  • 我们可以定义,当前状态 l , r l, r l,r ,贡献值为:以 r r r 结尾的区间个数,并且区间起始是从 l l l 开始,形式化为 r − l + 1 r - l + 1 r−l+1
  • 这样在 r r r 每次移动时,都对其计算贡献,显然每个状态都是不重的,并且对于答案这样是不会遗漏的。( r r r 会从起始移动到末尾)

误:一开始我对贡献计算是区间 l , r l, r l,r 之间所有区间数,显然这样会有大量的重复区间的计算,读者可自行思考。


代码

class Solution {public:#define ll long longlong long countSubarrays(vector<int>& nums, long long k) {int r = 0, n = nums.size();ll now = 0, len = 0, res = 0;for (int i = 0; i < n; i++) {while(r < n && ((now + nums[r])) * (len + 1) < k) {now += nums[r];len ++;res += (r - i + 1);r++;}now -= nums[i];len--;}return res;}
};

2022年6月12日01点06分

【LeetCode第 80 场双周赛】相关推荐

  1. LeetCode第45场双周赛-解题报告

    LeetCode第45场双周赛-解题报告 A. 唯一元素的和 原题链接 https://leetcode-cn.com/problems/sum-of-unique-elements/ 解题思路 因为 ...

  2. Leetcode 第 69 场双周赛记录

    Leetcode 第 69 场双周赛记录 1.第一题 5960. 将标题首字母大写 难度:easy 给你一个字符串 title ,它由单个空格连接一个或多个单词组成,每个单词都只包含英文字母.请你按以 ...

  3. LeetCode 第 30 场双周赛(477/2545,前18.7%,第2次全部通过)

    文章目录 1. 比赛结果 2. 题目 1. LeetCode 5177. 转变日期格式 easy 2. LeetCode 5445. 子数组和排序后的区间和 medium 3. LeetCode 54 ...

  4. LeetCode 第 31 场双周赛(273/2767,前9.87%,第3次全部通过)

    文章目录 1. 比赛结果 2. 题目 1. LeetCode 5456. 在区间范围内统计奇数数目 easy 2. LeetCode 5457. 和为奇数的子数组数目 medium 3. LeetCo ...

  5. LeetCode 第 18 场双周赛(188/587,前32%)

    文章目录 1. 比赛结果 2. 题目 LeetCode 1331. 数组序号转换 easy LeetCode 1328. 破坏回文串 medium LeetCode 1329. 将矩阵按对角线排序 m ...

  6. LeetCode 第 36 场双周赛(304/2204,前13.8%)

    文章目录 1. 比赛结果 2. 题目 1. LeetCode 5515. 设计停车系统 easy 2. LeetCode 5516. 警告一小时内使用相同员工卡大于等于三次的人 medium 3. L ...

  7. LeetCode 第 35 场双周赛(216/2839,前7.61%)

    文章目录 1. 比赛结果 2. 题目 1. LeetCode 5503. 所有奇数长度子数组的和 easy 2. LeetCode 5505. 所有排列中的最大和 medium 3. LeetCode ...

  8. LeetCode 第 34 场双周赛(385/2842,前13.5%)

    文章目录 1. 比赛结果 2. 题目 1. LeetCode 5491. 矩阵对角线元素的和 easy 2. LeetCode 5492. 分割字符串的方案数 medium 3. LeetCode 5 ...

  9. LeetCode 第 33 场双周赛(511/3304,前15.5%,第4次全部通过)

    文章目录 1. 比赛结果 2. 题目 1. LeetCode 5479. 千位分隔数 easy 2. LeetCode 5480. 可以到达所有点的最少点数目 medium 3. LeetCode 5 ...

最新文章

  1. f2 柱状图滚动 钉钉小程序_钉钉小程序图表库AntV - F2 使用总结
  2. 视图需要创建类吗_建筑类的职称需要先评初级吗
  3. Django的下载及命令
  4. 一个很全的中断资料网站
  5. qt opencv cmake配置 单纯小白
  6. LoadRunner常见问题分析
  7. 反应灵敏且性能卓越的Spray + Akka解决方案,以“在Java和Node.js中发挥并发性和性能”...
  8. AUTOSAR从入门到精通100讲(六)-AUTOSAR中的PostBuild Data Set Generation Phase
  9. iOS-APP启动页加载广告
  10. 【白皮书分享】2022新职业教育洞察白皮书:“职”成机遇,“育”见未来.pdf...
  11. 支付宝报错:missing-signature 未设置签名参数
  12. 清理C盘内存有用的办法
  13. 【推荐】阿里云主机accesskey利用工具
  14. 我如何构建Pomodoro Clock应用程序,以及在此过程中学到的课程
  15. ubuntu 软件安装到中途停止解决方法
  16. 公司寄件管理平台必要性分析
  17. 1053 住房空置率 (20分)
  18. Autograd:你没有使用过的最佳的机器学习库?
  19. 批量清理QQ好友的方法
  20. 作为程序员,首先要自清自己是什么人

热门文章

  1. [C语言]结构体进阶与枚举联合
  2. 基于人工神经网络的预测,神经网络做预测问题
  3. 如何应对肌肤皱纹和松弛 让你更年轻
  4. 我的世界酷牛选java_我的世界 / 常见问答 - 酷牛云™ 游戏服务器帮助中心
  5. [C++]高精度求2的n次方
  6. Flashflex大全
  7. 阅读文献《理论记录》——持续更新
  8. chrome浏览器无法访问百度
  9. 在线代码编辑器 CodeMirror 使用简介
  10. Android快速选字,哪款打字最快捷方便?Android输入法合辑