Leetcode 第 414 场周赛题解

embedded/2024/9/25 6:29:09/

Leetcode 第 414 场周赛题解

  • Leetcode 第 414 场周赛题解
    • 题目1:3280. 将日期转换为二进制表示
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:3281. 范围内整数的最大得分
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:3282. 到达数组末尾的最大得分
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:3283. 吃掉所有兵需要的最多移动次数
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 414 场周赛题解

题目1:3280. 将日期转换为二进制表示

思路

切分字符串,分成 year、month、day,转成二进制字符串,再拼接起来。

代码

/** @lc app=leetcode.cn id=3280 lang=cpp** [3280] 将日期转换为二进制表示*/// @lc code=start
class Solution
{
public:string convertDateToBinary(string date){string year = date.substr(0, 4);string month = date.substr(5, 2);string day = date.substr(8);return trans(year) + "-" + trans(month) + "-" + trans(day);}// 辅函数 - 转成二进制字符串string trans(string &s){int x = stoi(s);string res;while (x){res.insert(res.begin(), x % 2 + '0');x /= 2;}return res;}
};
// @lc code=end

复杂度分析

时间复杂度:O(n),其中 n 是字符串 date 的长度。

空间复杂度:O(n),其中 n 是字符串 date 的长度。

题目2:3281. 范围内整数的最大得分

思路

假设得分为 score。

把区间按照左端点排序。这样我们只需考虑相邻区间所选数字之差。

设从第一个区间选了数字 x,那么第二个区间所选的数字至少为 x+score,否则不满足得分的定义。

由于得分越大,所选数字越可能不在区间内,有单调性,可以二分答案。

代码

/** @lc app=leetcode.cn id=3281 lang=cpp** [3281] 范围内整数的最大得分*/// @lc code=start
class Solution
{
public:int maxPossibleScore(vector<int> &start, int d){int n = start.size();sort(start.begin(), start.end());auto check = [&](int score) -> bool{long long x = LLONG_MIN;for (int &s : start){x = max(x + score, (long long)s);if (x > s + d)return false;}return true;};int left = 0, right = floor(1.0 * (start[n - 1] + d - start[0]) / (n - 1)) + 1;while (left + 1 < right){int mid = left + (right - left) / 2;if (check(mid))left = mid;elseright = mid;}return left;}
};
// @lc code=end

复杂度分析

时间复杂度:O(nlogn+nlogA),其中 n 是数组 nums 的长度,A = (max(start)+d−min(start)) / (n−1)。排序的时间复杂度为 O(nlogn),二分 O(logA) 次,每次耗时 O(n)。

空间复杂度:O(1)。忽略排序的栈开销。

题目3:3282. 到达数组末尾的最大得分

思路

动态规划 + 贪心。

只用动态规划会超时:

class Solution {
public:long long findMaximumScore(vector<int>& nums) {if (nums.size() <= 1) return 0LL;int n = nums.size();vector<long long> dp(n + 1);dp[0] = 0;for (int j = 1; j <= n; j++) {for (int i = 1; i < j; i++) {dp[j] = max(dp[j], dp[i] + 1LL * (j - i) * nums[i - 1]);}}return dp[n];}
};

维护一个 maxIndex 表示之前 nums 元素最大值的下标,从贪心的角度思考,从maxIndex 跳到当前下标 i,增加的值最大。

代码

/** @lc app=leetcode.cn id=3282 lang=cpp** [3282] 到达数组末尾的最大得分*/// @lc code=start
class Solution
{
public:long long findMaximumScore(vector<int> &nums){if (nums.size() <= 1)return 0LL;int n = nums.size();vector<long long> dp(n);dp[0] = 0;int maxIndex = 0;for (int i = 1; i < n; i++){dp[i] = dp[maxIndex] + 1LL * (i - maxIndex) * nums[maxIndex];if (nums[i] > nums[maxIndex])maxIndex = i;}return dp[n - 1];}
};
// @lc code=end

复杂度分析

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

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

题目4:3283. 吃掉所有兵需要的最多移动次数

思路

定义状态为 dfs(i,mask),表示当前马在第 i 个兵的位置,且剩余没有被吃掉的兵的集合为 mask 的情况下,继续游戏,两名玩家的总移动次数的最大值。

设从 (x,y) 移动到第 i 个兵的最小步数为 dis[i][x][y],这可以用网格图 BFS 算出来:反向思考,计算从第 i 个兵的位置出发,通过「马走日」移动到 (x,y) 的最小步数。

设当前位置为 (x,y)=positions[i],考虑枚举吃掉第 j 个兵:

如果第 j 个兵在集合 mask 中,把马移动 dis[j][x][y] 步,吃掉第 j 个兵。现在问题变成当前马在第 j 个兵的位置,且剩余没有被吃掉的兵的集合为 mask∖{j} 的情况下,继续游戏,两名玩家的总移动次数的最大值。

如果当前是 Alice 操作,则取最大值;如果当前是 Bob 操作,则取最小值。

递归边界:dfs(i,∅)=0。所有兵都被吃掉,游戏结束。

递归入口:dfs(n,U)。即答案。

代码

#
# @lc app=leetcode.cn id=3283 lang=python3
#
# [3283] 吃掉所有兵需要的最多移动次数
## @lc code=start
DIRS = ((2, 1), (1, 2), (-1, 2), (-2, 1), (-2, -1), (-1, -2), (1, -2), (2, -1))class Solution:def maxMoves(self, kx: int, ky: int, positions: List[List[int]]) -> int:n = len(positions)# 计算马到兵的步数,等价于计算兵到其余格子的步数dis = [[[-1] * 50 for _ in range(50)] for _ in range(n)]for d, (px, py) in zip(dis, positions):d[px][py] = 0q = [(px, py)]step = 1while q:tmp = qq = []for p in tmp:for dx, dy in DIRS:x, y = p[0] + dx, p[1] + dyif 0 <= x < 50 and 0 <= y < 50 and d[x][y] < 0:d[x][y] = stepq.append((x, y))step += 1positions.append((kx, ky))u = (1 << n) - 1@cachedef dfs(i: int, mask: int) -> int:if mask == 0:return 0odd = (u ^ mask).bit_count() % 2res = inf if odd else 0x, y = positions[i]for j, d in enumerate(dis):if mask >> j & 1:if odd:# Bobres = min(res, dfs(j, mask ^ (1 << j)) + d[x][y])else:# Aliceres = max(res, dfs(j, mask ^ (1 << j)) + d[x][y])return resreturn dfs(n, u)
# @lc code=end

复杂度分析

时间复杂度:O(nL2+n22n),其中 n 是数组 positions 的长度,L=50。

空间复杂度:O(nL2+n2n),其中 n 是数组 positions 的长度,L=50。


http://www.ppmy.cn/embedded/113651.html

相关文章

金蝶SHR,在列表对某个金额字段汇总展示的需求

接到这个需求的初衷是因为二开了一个内推费用计算&#xff0c;其中有一列本次发放奖金&#xff0c;希望能做个汇总&#xff0c;以便转薪酬后去汇总核对 刚开始也翻看了薪酬查询的表格底部汇总&#xff0c;捣鼓了半天搞不出来&#xff0c;恕我无能。。。 后面换种方式&#xf…

【Linux】查看操作系统开机时初始化的驱动模块列表的一个方法

这个方法是摸索出来的&#xff0c;也不一定对&#xff1a; 1、驱动层module_init(module_init_function)作为模块初始化&#xff0c;并且提供模块内部初始化的函数名&#xff1b; 2、找到所有驱动目录drivers下所有module_init(module_init_function)&#xff0c;在内核6.9.0…

Agile Modbus STM32裸机移植 从机使用

本教程手把手教你实现Agile Modbus&#xff0c;照抄就能成。 并且会解读函数功能含义。 1. 引言 Agile Modbus 是一个轻量级的 Modbus 协议栈&#xff0c;可以满足用户在任何场景下的需求。 功能 支持 rtu 和 tcp 协议&#xff0c;使用纯 C 语言开发&#xff0c;不涉及任何硬…

深度学习的笔记

1. 从huggingface上仅下载pytorch模型权重和配置文件到服务器 import os import shutil from huggingface_hub import snapshot_download# 直接指定模型和下载路径 model_name openai/clip-vit-base-patch32 download_path /home/xxx/.cache/huggingface/hub/models--anas-a…

基于stm32的四旋翼无人机控制系统设计系统设计与实现

文章目录 前言资料获取设计介绍功能介绍设计程序 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业…

1. 如何在Java中连接MySQL数据库?请解释使用JDBC连接的步骤。

要在Java中连接MySQL数据库&#xff0c;通常使用JDBC&#xff08;Java Database Connectivity&#xff09;API。这是一个用于执行SQL语句的Java API&#xff0c;可以用来访问关系型数据库。下面是使用JDBC连接MySQL数据库的详细步骤&#xff1a; 1. 添加MySQL JDBC驱动 首先&a…

每日新闻掌握【2024年9月12日 星期四】

2024年9月12日 星期四 农历八月初十 大公司/大事件 iPhone 16 Pro Max机型或占总销量35% 市场研究机构TechInsights发布报告&#xff0c;预计iPhone 16系列的出货量将超过其前代产品&#xff0c;2024年全球出货量预计将达到7300万台。此外iPhone 16 Pro Max预计将成为iPhone …

如何用python做一个计算器

很久不更新了&#xff0c;今天来更新一下&#xff0c;初学python&#xff0c;若有可以完善部分可以私信&#xff0c;谢谢大家的支持&#xff0c;代码如下&#xff1a; print("欢迎使用计算器")aint(input("请输入第一个数字\n")) bint(input("请输入第…