Leetcode 第 379 场周赛题解

2024-01-15 07:36
文章标签 leetcode 周赛 题解 379

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

Leetcode 第 379 场周赛题解

  • Leetcode 第 379 场周赛题解
    • 题目1:10035. 对角线最长的矩形的面积
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:10036. 捕获黑皇后需要的最少移动次数
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:10037. 移除后集合的最多元素数
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:10038. 执行操作后的最大分割数量
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 379 场周赛题解

题目1:10035. 对角线最长的矩形的面积

思路

模拟。

代码

/** @lc app=leetcode.cn id=10035 lang=cpp** [10035] 对角线最长的矩形的面积*/// @lc code=start
class Solution
{
public:int areaOfMaxDiagonal(vector<vector<int>> &dimensions){// 特判if (dimensions.empty())return 0;double maxDiagonal = 0.0;int maxArea = 0;for (vector<int> &dimension : dimensions){int length = dimension[0], width = dimension[1];if (sqrt(length * length + width * width) > maxDiagonal){maxDiagonal = sqrt(length * length + width * width);maxArea = length * width;}else if (sqrt(length * length + width * width) == maxDiagonal)maxArea = max(maxArea, length * width);}return maxArea;}
};
// @lc code=end

复杂度分析

时间复杂度:O(n),其中 n 是数组 dimensions 的长度。

空间复杂度:O(1)。

题目2:10036. 捕获黑皇后需要的最少移动次数

思路

分类讨论:

  • 如果车能直接攻击到皇后,答案是 1。
  • 如果象能直接攻击到皇后,答案是 1。
  • 如果车被象挡住,那么移走象,车就可以攻击到皇后,答案是 2。
  • 如果象被车挡住,那么移走车,象就可以攻击到皇后,答案是 2。
  • 如果车不能直接攻击到皇后,那么车可以水平移动或者垂直移动,其中一种方式必定不会被象挡住,可以攻击到皇后,答案是 2。

对于车,如果和皇后在同一水平线或者同一竖直线,且中间没有象,那么就可以直接攻击到皇后。

对于象,如果和皇后在同一斜线,且中间没有车,那么就可以直接攻击到皇后。

代码

/** @lc app=leetcode.cn id=10036 lang=cpp** [10036] 捕获黑皇后需要的最少移动次数*/// @lc code=start
class Solution
{
public:int minMovesToCaptureTheQueen(int a, int b, int c, int d, int e, int f){// 车和皇后在一条横线上,且它们之间没有象if (a == e && !(a == c && d > min(b, f) && d < max(b, f)))return 1;// 车和皇后在一条竖线上,且它们之间没有象if (b == f && !(b == d && c > min(a, e) && c < max(a, e)))return 1;// 象和皇后在一条斜线上,且它们之间没有车if ((c + d == e + f && !(a + b == e + f && a > min(c, e) && a < max(c, e))) ||(c - d == e - f && !(a - b == e - f && a > min(c, e) && a < max(c, e))))return 1;return 2;}
};
// @lc code=end

复杂度分析

时间复杂度:O(1)。

空间复杂度:O(1)。

题目3:10037. 移除后集合的最多元素数

思路

贪心。

可以将数组去重后分为三个部分:nums1 独有的,nums2 独有的,nums1 与 nums2 共有的。

求集合 S 时:

  1. 先选择两个数组独有的。
  2. 对于共有的,两个数组尽量选不一样的。

代码

/** @lc app=leetcode.cn id=10037 lang=cpp** [10037] 移除后集合的最多元素数*/// @lc code=start
class Solution
{
public:int maximumSetSize(vector<int> &nums1, vector<int> &nums2){int n = nums1.size();unordered_set<int> set1, set2;for (int &x : nums1)set1.insert(x);for (int &x : nums2)set2.insert(x);int common = 0; // 两个数组共有的元素个数for (int x : set1)if (set2.count(x))common++;// count1 和 count2 分别为数组 nums1 和 nums2 独有元素的个数int count1 = set1.size() - common, count2 = set2.size() - common;// 贪心策略:先选二者独有的,没得选才选二者共有的int s1 = min(count1, n / 2), s2 = min(count2, n / 2);return s1 + s2 + min(n - s1 - s2, common);}
};
// @lc code=end

复杂度分析

时间复杂度:O(n),其中 n 是数组 nums1/nums2 的长度。

空间复杂度:O(n),其中 n 是数组 nums1/nums2 的长度。

题目4:10038. 执行操作后的最大分割数量

思路

题解:两种方法:记忆化搜索/O(n)前后缀分解(Python/Java/C++/Go)

代码

/** @lc app=leetcode.cn id=10038 lang=cpp** [10038] 执行操作后的最大分割数量*/// @lc code=start// 记忆化搜索+记录字符集合class Solution
{
public:int maxPartitionsAfterOperations(string s, int k){unordered_map<long long, int> memo;function<int(int, int, bool)> dfs = [&](int i, int mask, bool changed) -> int{if (i == s.length()){return 1;}long long args_mask = (long long)i << 32 | mask << 1 | changed;auto it = memo.find(args_mask);if (it != memo.end()){ // 之前计算过return it->second;}int res;// 不改 s[i]int bit = 1 << (s[i] - 'a');int new_mask = mask | bit;if (__builtin_popcount(new_mask) > k){// 分割出一个子串,这个子串的最后一个字母在 i-1// s[i] 作为下一段的第一个字母,也就是 bit 作为下一段的 mask 的初始值res = dfs(i + 1, bit, changed) + 1;}else{ // 不分割res = dfs(i + 1, new_mask, changed);}if (!changed){// 枚举把 s[i] 改成 a,b,c,...,zfor (int j = 0; j < 26; j++){new_mask = mask | (1 << j);if (__builtin_popcount(new_mask) > k){// 分割出一个子串,这个子串的最后一个字母在 i-1// j 作为下一段的第一个字母,也就是 1<<j 作为下一段的 mask 的初始值res = max(res, dfs(i + 1, 1 << j, true) + 1);}else{ // 不分割res = max(res, dfs(i + 1, new_mask, true));}}}return memo[args_mask] = res; // 记忆化};return dfs(0, 0, false);}
};
// @lc code=end

复杂度分析

在这里插入图片描述

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



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

相关文章

哈希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

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

LeetCode:64. 最大正方形 动态规划 时间复杂度O(nm)

64. 最大正方形 题目链接 题目描述 给定一个由 0 和 1 组成的二维矩阵,找出只包含 1 的最大正方形,并返回其面积。 示例1: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 示例2: 输入: 0 1 1 0 01 1 1 1 11 1 1 1 11 1 1 1 1输出: 9 解题思路 这道题的思路是使用动态规划

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述