LeetCode 第413场周赛个人题解

2024-09-02 04:44

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

目录

3274. 检查棋盘方格颜色是否相同

原题链接

思路分析

AC代码

3275. 第 K 近障碍物查询

原题链接

思路分析

AC代码

3276. 选择矩阵中单元格的最大得分

原题链接

思路分析

AC代码

3277. 查询子数组最大异或值

原题链接

思路分析

AC代码


3274. 检查棋盘方格颜色是否相同

原题链接

3274. 检查棋盘方格颜色是否相同

思路分析

签到题

时间复杂度:O(1)

AC代码

class Solution:def checkTwoChessboards(self, s1: str, s2: str) -> bool:return (ord(s1[0]) % 2) ^ (ord(s2[0]) % 2) == (ord(s1[1]) % 2) ^ (ord(s2[1]) % 2)

3275. 第 K 近障碍物查询

原题链接

3275. 第 K 近障碍物查询

思路分析

大根堆维护 topk 即可

时间复杂度O(qlogn)

AC代码

class Solution:def resultsArray(self, queries: List[List[int]], k: int) -> List[int]:h = []res = []for x, y in queries:heappush(h, (-abs(x) - abs(y), x, y))if len(h) > k:heappop(h)if len(h) < k:res.append(-1)else:res.append(-h[0][0])return res

3276. 选择矩阵中单元格的最大得分

原题链接

3276. 选择矩阵中单元格的最大得分

思路分析

最大费用最大流

建立虚拟源汇点s,t

源点向每行连容量为1,费用为0的边

每行向行内数字连容量为1,费用为0的边

每个数字向汇点连容量为1,费用为数字的边

然后跑板子即可

时间复杂度:略,分析网络流复杂度没有意义

AC代码

using i64 = long long;struct MCFGraph{struct Edge{int v, cap, w;Edge(int _v, int _cap, int _w) : v(_v), cap(_cap), w(_w) {}};const int n;std::vector<Edge> e;std::vector<std::vector<int>> g;std::vector<i64> h, dis;    // h 为 势 数组std::vector<int> pre;std::vector<bool> vis;void spfa(const int s, const int t) {static std::queue<int> q;h.assign(n, std::numeric_limits<i64>::min());q.push(s);h[s] = 0;while (q.size()) {int u = q.front();q.pop();vis[u] = false;for (int i : g[u]) {const auto& [v, cap, w] = e[i];if (cap > 0 && h[v] < h[u] + w) {h[v] = h[u] + w;if (!vis[v])q.push(v), vis[v] = true;}}}}bool dijkstra(const int s, const int t){static std::priority_queue<std::pair<i64, int>, std::vector<std::pair<i64, int>>> pq;dis.assign(n, std::numeric_limits<i64>::min());pre.assign(n, -1);dis[s] = 0;pq.emplace(0, s);while (pq.size()) {auto [d, u] = pq.top();pq.pop();if (dis[u] < d) continue;for (int i : g[u]) {const auto& [v, cap, w] = e[i];if (cap > 0 && dis[v] < w + d + h[u] - h[v]) {dis[v] = w + d + h[u] - h[v];pre[v] = i;pq.emplace(dis[v], v);}}}return dis[t] > std::numeric_limits<i64>::min();}MCFGraph(int _n) : n(_n), g(n), vis(n){}void addEdge(int u, int v, int c, int f) { // 最大流g[u].push_back(e.size());e.emplace_back(v, c, f);g[v].push_back(e.size());e.emplace_back(u, 0, -f);}std::pair<int, i64> flow(const int s, const int t) {int flow = 0;i64 cost = 0;h.assign(n, 0);spfa(s, t);while (dijkstra(s, t)) {// 更新h 为实际disfor (int i = 0; i < n; ++ i)    h[i] += dis[i];int aug = std::numeric_limits<int>::max();for (int i = t; i != s; i = e[pre[i] ^ 1].v)aug = std::min(aug, e[pre[i]].cap);for (int i = t; i != s; i = e[pre[i] ^ 1].v)e[pre[i]].cap -= aug, e[pre[i] ^ 1].cap += aug;flow += aug;cost += (i64)aug * h[t];}return std::make_pair(flow, cost);}
};
class Solution {
public:int maxScore(vector<vector<int>>& grid) {int n = grid.size(), m = grid[0].size();// 0~99 0~n-1std::unordered_map<int, std::unordered_set<int>> adj;std::unordered_map<int, int> id;int tot = 0;for (int i = 0; i < n; ++ i) {for (int v : grid[i])if (!id.contains(v))id[v] = tot ++;}MCFGraph g(n + tot + 2);int s = n + tot, t = s + 1;for (int i = 0; i < n; ++ i) {for (int v : grid[i]) {adj[i].insert(id[v]);}g.addEdge(s, i, 1, 0);}for (auto &[i, v] : adj) {for (int x : v)g.addEdge(i, n + x, 1, 0);}for (auto &[x, i] : id)g.addEdge(n + i, t, 1, x);return g.flow(s, t).second;}
};

3277. 查询子数组最大异或值

原题链接

3277. 查询子数组最大异或值

思路分析

区间DP

定义f(l, r) 为[l, r] 的数组异或值(注意这是题目的定义)

ma(l, r) 为 [l, r] 内所有子数组的最大数组异或值

那么f(l, r) = f(l, r - 1) ^ f(l + 1, r)

ma(l, r) = max(f(l, r), ma(l, r - 1), ma(l + 1, r))

本题不难,如果没有像我一样看错题的话

时间复杂度:O(N^2)

AC代码

class Solution {
public:vector<int> maximumSubarrayXor(vector<int>& nums, vector<vector<int>>& queries) {int n = nums.size();std::vector<std::vector<int>> f(n, std::vector<int>(n)), ma(f);for (int i = 0; i < n; ++ i) f[i][i] = ma[i][i] = nums[i];for (int len = 2; len <= n; ++ len) {for (int i = 0; i + len <= n; ++ i) {int j = i + len - 1;f[i][j] = f[i][j - 1] ^ f[i + 1][j];ma[i][j] = std::max({f[i][j], ma[i + 1][j], ma[i][j - 1]});}}std::vector<int> res;for (auto &q : queries)res.push_back(ma[q[0]][q[1]]);return res;}
};

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



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

相关文章

哈希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就行了。 这样

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

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