LeetCode 第394场周赛个人题解

2024-04-21 14:52

本文主要是介绍LeetCode 第394场周赛个人题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

100294. 统计特殊字母的数量 I

原题链接

思路分析

AC代码

100291. 统计特殊字母的数量 II

原题链接

思路分析

AC代码

100290. 使矩阵满足条件的最少操作次数

原题链接

思路分析

AC代码

100276. 最短路径中的边

原题链接

思路分析

AC代码


100294. 统计特殊字母的数量 I

原题链接

100294. 统计特殊字母的数量 I

思路分析

签到题不说了

AC代码

class Solution {
public:int numberOfSpecialChars(string word) {int res = 0;unordered_set<char> st;for(auto x : word) st.insert(x);for(char x = 'a', y = 'A'; x <= 'z'; x ++, y ++)if(st.count(x) && st.count(y)) res ++;return res;}
};

100291. 统计特殊字母的数量 II

原题链接

100291. 统计特殊字母的数量 II

思路分析

比赛中为了一次ac避免罚时,选择统计每个字符的第一次出现位置和最后一次出现位置

然后遍历26个小写字母判断它们的最后一次出现位置是否比大写字母第一次出现位置靠前即可

时间复杂度O(n)

AC代码

class Solution:def numberOfSpecialChars(self, word: str) -> int:first, last = dict(), dict()n = len(word)for i, x in enumerate(word[::-1]):first[x] = n - ifor i, x in enumerate(word):last[x] = ires = 0for ch in range(ord('a'), ord('z') + 1):x = chr(ch)if x in last and str.upper(x) in first and last[x] < first[str.upper(x)]:res += 1return res

100290. 使矩阵满足条件的最少操作次数

原题链接

100290. 使矩阵满足条件的最少操作次数

思路分析

最终形态:每列都相等,不存在相同的相邻两列

那么我们只需要讨论每一列取什么值能够使得每相邻两列不同且操作次数最少

定义状态f(i, j),为考虑到第 i 列且第i列取j,两两相邻列不重复的最小操作次数

记cnt[i][j]为原网格第i列中j的出现次数

那么有转移方程f(i + 1, j) = min(f(i + 1, j), f(i, k) + m - cnt[i + 1][j])

状态数:n * k,k = 10,状态转移O(k)

故时间复杂度O(nk^2)

AC代码

class Solution {
public:int minimumOperations(vector<vector<int>>& g) {int m = g.size(), n = g[0].size();vector<vector<int>> cnt(n + 1, vector<int>(10));for(int i = 0; i < m; i++)for(int j = 0; j < n; j++)cnt[j + 1][g[i][j]] ++;vector<vector<int>> f(n + 1, vector<int>(10));for(int i = 0; i < n; i++)for(int j = 0; j < 10; j++){f[i + 1][j] = 1e9;for(int k = 0; k < 10; k++){if(k == j) continue;f[i + 1][j] = min(f[i + 1][j], f[i][k] + m - cnt[i + 1][j]);}}return *min_element(f[n].begin(), f[n].end());}
};

100276. 最短路径中的边

原题链接

100276. 最短路径中的边

思路分析

唯一一发WA在这道题了,变量名写错了淦

emm,最短路&dijkstra变形题中非常经典的变形,都是在dijkstra上加个递推

和这道题一个路子:1976. 到达目的地的方案数

只不过把求最短路的数目改为了对所有最短路上边的标记

最短路的数目都能求这个自然也能求,换汤不换药

定义pre[i]为结点 i 在到达n - 1的所有最短路的前驱边编号的集合

我们求dijkstra的时候,记出队结点为x

如果dst[x] + w(x, y) < dst[y],那么清空pre[y],把<x, y>的编号假如pre[y]

如果dst[x] + w(x, y) = dst[y],把<x, y>的编号假如pre[y]

然后路径恢复,即从n - 1往前跑一直走到0即可

时间复杂度O(mlogm)

AC代码

class Solution {
public:typedef long long LL;typedef pair<LL, int> PLI;typedef pair<int, int> PII;typedef pair<PII, int> PIII;#define mkp make_pairvector<bool> findAnswer(int n, vector<vector<int>>& edges) {int m = edges.size();vector<vector<PIII>> g(n);vector<LL> dst(n, 1e12);vector<bool> ret(m);vector<unordered_set<int>> pre(n);for(int i = 0; i < m; i++) g[edges[i][0]].emplace_back(mkp(edges[i][1], edges[i][2]), i), g[edges[i][1]].emplace_back(mkp(edges[i][0], edges[i][2]), i);priority_queue<PLI, vector<PLI>, greater<PLI>> pq;pq.emplace(dst[0] = 0, 0);while(pq.size()){auto [d, x] = pq.top();pq.pop();if(x == n - 1) break;for(auto&e : g[x]){int y = e.first.first, w = e.first.second, i = e.second;if(dst[x] + w < dst[y]){pre[y].clear();pre[y].insert(i);pq.emplace(dst[y] = dst[x] + w, y);}else if(dst[x] + w == dst[y]){pre[y].insert(i);}}}if(dst[n - 1] == 1e12) return ret;queue<int> q;q.emplace(n - 1);vector<bool> vis(n);  while(q.size()){auto t = q.front(); q.pop();if(vis[t]) continue;vis[t] = 1;for(auto x : pre[t]){int u = edges[x][0], v = edges[x][1];//cout << u << ' ' << v << ' ';ret[x] = 1;if(u == t) swap(u, v);q.emplace(u);}}return ret;}
};
/*
输出:
[false,false,false,false,false,false,false,false,true,false,false,false]
预期:
[false,false,false,true,false,false,false,false,true,false,false,false]
*/

这篇关于LeetCode 第394场周赛个人题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/923347

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

HomeBank:开源免费的个人财务管理软件

在个人财务管理领域,找到一个既免费又开源的解决方案并非易事。HomeBank&nbsp;正是这样一个项目,它不仅提供了强大的功能,还拥有一个活跃的社区,不断推动其发展和完善。 开源免费:HomeBank 是一个完全开源的项目,用户可以自由地使用、修改和分发。用户友好的界面:提供直观的图形用户界面,使得非技术用户也能轻松上手。数据导入支持:支持从 Quicken、Microsoft Money

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

分布式系统的个人理解小结

分布式系统:分的微小服务,以小而独立的业务为单位,形成子系统。 然后分布式系统中需要有统一的调用,形成大的聚合服务。 同时,微服务群,需要有交流(通讯,注册中心,同步,异步),有管理(监控,调度)。 对外服务,需要有控制的对外开发,安全网关。