LeetCode周赛#205
5508. 数的平方等于两数乘积的方法数 #模拟 #哈希表
题目链接
题意
给你两个整数数组nums1 和 nums2 ,请你返回根据以下规则形成的三元组的数目(类型 1 和类型 2 ):
- 类型 1:三元组
(i, j, k),如果nums1[i]2 == nums2[j] * nums2[k]其中0 <= i < nums1.length且0 <= j < k < nums2.length - 类型 2:三元组
(i, j, k),如果nums2[i]2 == nums1[j] * nums1[k]其中0 <= i < nums2.length且0 <= j < k < nums1.length
分析
由于两数组的长度不超过1e3,直接将两数组内部的所有组合都枚举下来,并将其乘积存到map中。最后两数组每个元素进行平方,检查该结果是否在map标记过,若标记过,便累加。
typedef long long ll;
class Solution {
public:
int numTriplets(vector<int>& nums1, vector<int>& nums2) {
unordered_map<ll, int> map1, map2;
for(int i = 0; i < nums1.size(); i++){
for(int j = i + 1; j < nums1.size(); j++){
ll cur = 1ll * nums1[i] * nums1[j];
map1[cur]++;
}
}
for(int i = 0; i < nums2.size(); i++){
for(int j = i + 1; j < nums2.size(); j++){
ll cur = 1ll * nums2[i] * nums2[j];
map2[cur]++;
}
}
int ans = 0;
for(int i = 0; i < nums1.size(); i++){
ll cur = 1ll * nums1[i] * nums1[i];
if(map2[cur]) ans += map2[cur];
}
for(int i = 0; i < nums2.size(); i++){
ll cur = 1ll * nums2[i] * nums2[i];
if(map1[cur]) ans += map1[cur];
}
return ans;
}
};
5509. 避免重复字母的最小删除成本 #贪心
题目链接
题意
给定字符串 s 和整数数组 cost ,其中 cost[i] 是从s 中删除字符 i 的代价。
现要求将字符串任意相邻两个字母不相同的最小删除成本。
分析
若有若干个重复的字符,我们只能保留其中一个。为保证代价最小,显然应该留下代价最大的。我们一趟遍历,实时检查当前字符是否与上一字符相等,如果相等,便累加代价、更新字符最大代价。当遇到不相等字符时,更新答案,重新计数重复次数。
class Solution {
public:
int minCost(string s, vector<int>& cost) {
char last = '#'; //记录上一字符
int mymax = cost[0]; //重复字符中代价最大
int cnt = 1; //记录某个字符的重复次数
int i = 0, sum = 0, len = s.length();
int tmpsum = 0; //累加重复字符的代价之和
while(i < len){
if(last == s[i]){ //说明当前字符与上一相邻字母重复
mymax = max(mymax, cost[i]);
tmpsum += cost[i];
cnt++;
}
else if(last != s[i]){
if(cnt > 1) sum += (tmpsum - mymax);
mymax = tmpsum = cost[i];
cnt = 1;
last = s[i];
}
i++; //O(n)
}
if(cnt > 1) sum += (tmpsum - mymax); //边界情况
return sum;
}
};
5510. 保证图可完全遍历 #并查集 #最小生成树
题目链接
题意
有一n阶无向图,并有三种类型的边:
类型 1:只能由 Alice 遍历。
类型 2:只能由 Bob 遍历。
类型 3:Alice 和 Bob 都可以遍历。
给定数组 edges ,其中edges[i] = [typei, ui, vi],表示节点 ui 和 vi 之间存在类型为 typei 的双向边。请你在保证图仍能够被 Alice和 Bob 完全遍历的前提下,找出可以删除的最大边数。(如果从任何节点开始,Alice 和 Bob 都可以到达所有其他节点,则认为图是可以完全遍历的。)如果 Alice 和 Bob 无法完全遍历图,则返回 -1 。
样例

分析
如果同一子集用公共边(对应类型3的边)就能够走完,那么同一子集中无需使用Alice或Bob的特殊边(对应类型1/2的边),删除公共边造成的影响会比删除特殊边更大。我们暂时只考虑类型3的边,利用并查集,构建一棵类型3组成的最小生成森林,此处之所以说是森林,是因为单凭类型3的边不能保证整个图是连通的。在搭建森林时,我们就已经将多余的类型3的边去除掉,只保留最少的类型3的边,因而在并查集合并时需要统计下合并的边数量tree3。
接下来我们要分别保证Alice和Bob能够完全遍历。即在原有的类型3的最小生成森林中,用类型2的边构建最小生成树,统计需要合并的类型2的边数量tree2,从而保证Bob在不多余边的情况下完全遍历;同理,原有的类型3的最小生成森林中构建类型1的边构建最小生成树,统计类型1的边tree1。最后计算edges.size() - (tree1 + tree2 + tree3),统计最终要删除的边数总和
class Solution {
private:
int fa1[100005] = {0}, fa2[100005] = {0};
public:
int findSet(int x, int fa[]){
if(x != fa[x]) fa[x] = findSet(fa[x], fa);
return fa[x];
}
void Union(int x, int y, int fa[]){
fa[y] = x;
}
int maxNumEdgesToRemove(int n, vector<vector<int>>& edges) {
int tree3 = 0, tree2 = 0, tree1 = 0;
for(int i = 1; i <= n; i++) fa1[i] = fa2[i] = i;
for(int i = 0; i < edges.size(); i++){
if(edges[i][0] != 3) continue;
int u = edges[i][1], v = edges[i][2];
int pu = findSet(u, fa1), pv = findSet(v, fa1);
if(pu != pv){
tree3++; Union(pu, pv, fa1);
}
}
for(int i = 1; i <= n; i++) fa2[i] = fa1[i];
for(int i = 0; i < edges.size(); i++){
if(edges[i][0] != 1) continue;
int u = edges[i][1], v = edges[i][2];
int pu = findSet(u, fa1), pv = findSet(v, fa1);
if(pu != pv){
tree1++; Union(pu, pv, fa1);
}
}
for(int i = 0; i < edges.size(); i++){
if(edges[i][0] != 2) continue;
int u = edges[i][1], v = edges[i][2];
int pu = findSet(u, fa2), pv = findSet(v, fa2);
if(pu != pv){
tree2++; Union(pu, pv, fa2);
}
}
int cnt1 = 0, cnt2 = 0;
for(int i = 1; i <= n; i++) {
if(fa1[i] == i) cnt1++;
if(fa2[i] == i) cnt2++;
}
if(cnt1 != 1 || cnt2 != 1) return -1;
return edges.size() - (tree1 + tree2 + tree3);
}
};
LeetCode周赛#205的更多相关文章
- leetcode 周赛 205 1576-5508-5509-5510
第四题比较难,看题解用并查集做比较简单,但是我觉得难度在想到用并查集,可能是最近做题少所以想不到吧. 1 替换所有的问号 class Solution { public: string modifyS ...
- 【Leetcode周赛】从contest-111开始。(一般是10个contest写一篇文章)
Contest 111 (题号941-944)(2019年1月19日,补充题解,主要是943题) 链接:https://leetcode.com/contest/weekly-contest-111 ...
- 【一天一道LeetCode】#205. Isomorphic Strings
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given t ...
- Baozi Leetcode Solution 205: Isomorphic Strings
Problem Statement Given two strings s and t, determine if they are isomorphic. Two strings are isomo ...
- 拼写单词[哈希表]----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 ...
随机推荐
- vue 404
问题描述:前端同事使用Vue.js框架,利用vue-route结合webpack编写了一个单页路由项目,运维协助在服务器端配置nginx.部署完成后,访问首页没问题,从首页里打开二级页面没问题,但是所 ...
- Win32编程之控制线程
0x01. 如何让线程停下来 让自己停下来: Sleep() 函数 当程序执行到某段代码的时候可以使用sleep() 函数进行暂停 使用sleep()函数挂起的时候会自动恢复过来的 让别人停下来: S ...
- 拖拽编写SVG图形化工具(二)
getAttributesNs/setAttributesNs element.setAttributeNS(namespace,name,value) namespace 是指定属性的命名空间的一个 ...
- 如何解决 Nginx 端口映射到外网后访问地址端口丢失的问题
1. 问题说明 一个手机h5页面的项目,使用nginx(监听80端口)进行访问,内网访问的地址是192.168.12.125/h5,访问正常,nginx中的配置如下: #微信H5页面访问 locati ...
- 《Head First 设计模式》:与设计模式相处
正文 一.设计原则 1.封装变化 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起. 2.针对接口编程,不针对实现编程 "针对接口编程"真正的意思是& ...
- selenium中如何保证操作元素的成功率?也就是说如何保证我点击的元素一定是可以点击的?
1.在寻找元素时,加上显示等待或者隐式等待,这样在对元素进行操作之前保证元素被找到,进而提高成功率: 2.在对元素操作之前,比如click,如果该元素未display(非hidden),就需要先滚动到 ...
- python机器学习识别手写数字
手写数字识别 关注公众号"轻松学编程"了解更多. 导包 import numpy as np import matplotlib.pyplot as plt %matplotlib ...
- 快速傅里叶变换学习笔记(FFT)
什么是FFT FFT是用来快速计算两个多项式相乘的一种算法. 如果我们暴力计算两个多项式相乘,复杂度必然是\(O(n^2)\)的,而FFT可以将复杂度降至\(O(nlogn)\) 如何FFT 要学习F ...
- 解决SBT下载慢,dump project structure from sbt?
一. 安装SBT,参考https://blog.csdn.net/zcf1002797280/article/details/49677881 二. 在~/.sbt下新建repositories添加如 ...
- 01 . Go语言的SSH远程终端及WebSocket
Crypto/ssh简介 使用 下载 go get "github.com/mitchellh/go-homedir" go get "golang.org/x/cryp ...