5508. 数的平方等于两数乘积的方法数 #模拟 #哈希表

题目链接

题意

给你两个整数数组nums1nums2 ,请你返回根据以下规则形成的三元组的数目(类型 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.length0 <= 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],表示节点 uivi 之间存在类型为 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的更多相关文章

  1. leetcode 周赛 205 1576-5508-5509-5510

    第四题比较难,看题解用并查集做比较简单,但是我觉得难度在想到用并查集,可能是最近做题少所以想不到吧. 1 替换所有的问号 class Solution { public: string modifyS ...

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

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

  3. 【一天一道LeetCode】#205. Isomorphic Strings

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given t ...

  4. Baozi Leetcode Solution 205: Isomorphic Strings

    Problem Statement Given two strings s and t, determine if they are isomorphic. Two strings are isomo ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. git 上传代码报错eslint --fix found some errors. Please fix them and try committing again.

    在提交时用下面这句 git commit --no-verify -m "提交时的注释"

  2. python使用pip安装第三方模块遇到的问题及解决方法

    python使用pip安装第三方模块遇到的问题及解决方法 关注公众号"轻松学编程"了解更多. 使用国内源: 清华:https://pypi.tuna.tsinghua.edu.cn ...

  3. [Luogu P2341] [HAOI2006]受欢迎的牛 (缩点+bitset)

    题面 传送门:https://www.luogu.org/problemnew/show/P2341 Solution 前排提示,本蒟蒻做法既奇葩又麻烦 我们先可以把题目转换一下. 可以把一头牛喜欢另 ...

  4. 公钥、私钥、SSL/TLS、会话密钥、DES【转载】

    原文链接:https://www.cnblogs.com/thbCode/p/5829719.html 一,公钥私钥1,公钥和私钥成对出现2,公开的密钥叫公钥,只有自己知道的叫私钥3,用公钥加密的数据 ...

  5. P5958 【[POI2017]Sabotaż】

    P5958 [[POI2017]Sabotaż] 题意描述 在一棵以1号节点为根节点的树上,有很多纯洁的白点, BUT,突然有一个黑点出现(可能在任意位置) 它要染黑尽可能多的节点,而在一棵子树中, ...

  6. 快快使用ModelArts,零基础小白也能玩转AI!

    摘要: 走过路过不要错过,看Copy攻城狮如何借力华为云ModelArts玩转AI. "自2018年10月发布以来,ModelArts累计服务了众多行业十几万开发者,通过基础平台的完备性和面 ...

  7. Thinkphp3.2 cms之文章模块

    二.文章模块 <?php namespace Admin\Controller; use Think\Controller; class NewController extends Common ...

  8. leetcode115:search -insert-position

    题目描述 给出一个有序的数组和一个目标值,如果数组中存在该目标值,则返回该目标值的下标.如果数组中不存在该目标值,则返回如果将该目标值插入这个数组应该插入的位置的下标 假设数组中没有重复项. 下面给出 ...

  9. [Docker镜像] 关于阿里云容器镜像服务的使用(以天池比赛提交镜像为例)

    最近在参加天池比赛,由于比赛需要使用阿里云容器镜像服务完成线上预测任务,所以花费了3-4天的时间了解并使用Docker完成相关镜像操作,在此分享下我学习的内容,以下是本文的目录结构: 介绍 镜像 容器 ...

  10. minishell的实现

    直接上各个模块的代码,注释都在文档代码中,非常详细,加上最后的Makefile文件完全可以自行运行看懂: main函数一个文件main.c 1 /* 2 minishell实现的功能:简单命令解析.管 ...