LeetCode --- 448 周赛

题目列表

3536. 两个数字的最大乘积
3537. 填充特殊网格
3538. 合并得到最小旅行时间
3539. 魔法序列的数组乘积之和

一、两个数字的最大乘积

在这里插入图片描述
由于数据都是正数,所以乘积最大的两个数,本质就是找数组中最大的两个数即可,可以排序后直接找到,也可以通过遍历找到,代码如下

// C++
// 遍历
class Solution {
public:int maxProduct(int n) {int mx1 = 0, mx2 = 0;while(n){int x = n % 10;if(x > mx1) mx2 = mx1, mx1 = x;else if(x > mx2) mx2 = x;n /= 10;}return mx1 * mx2;}
};
# Python
class Solution:def maxProduct(self, n: int) -> int:mx1 = 0mx2 = 0while n:x = n % 10if x > mx1:mx1, mx2 = x, mx1elif x > mx2:mx2 = xn //= 10return mx1 * mx2

二、填充特殊网格

在这里插入图片描述
这是个很经典的分治题,根据题目描述,对于一个网格图,可以将它划分成四个象限,即四个小网格图,而对于每一个小网格图,我们又能划分成四个象限,很显然,这是规模更小的子问题,可以用递归来解决,代码如下

// C++
class Solution {
public:vector<vector<int>> specialGrid(int n) {int cnt = 0;vector grid(1 << n, vector<int>(1 << n));auto dfs = [&](this auto&& dfs, int x, int y, int d){ // 根据左上角坐标和边长就能确定一个网格图if(d == 1){grid[x][y] = cnt++;return;}int new_d = d / 2;// 按照这样的顺序,网格中的数字从小到大依次增长// 右上象限dfs(x, y + new_d, new_d);// 右下象限dfs(x + new_d, y + new_d, new_d);// 左下象限dfs(x + new_d, y, new_d);// 左上象限dfs(x, y, new_d);};dfs(0, 0, 1 << n);return grid;}
};
# Python
class Solution:def specialGrid(self, n: int) -> List[List[int]]:grid = [[0] * (1 << n) for _ in range(1 << n)]cnt = 0def dfs(x: int, y: int, d: int):if d == 1:nonlocal cntgrid[x][y] = cntcnt += 1returndfs(x, y + d // 2, d // 2)dfs(x + d // 2, y + d // 2, d // 2)dfs(x + d // 2, y, d // 2)dfs(x, y, d // 2)dfs(0, 0, 1 << n)return grid

三、合并得到最小旅行时间

在这里插入图片描述
本题可以用选或不选的思想,对于每一个索引 i,我们都可以考虑是否删除它,如果删除,则下一段路程的 next_time = time[i] + time[i+1],同时,我们还需要记录上一段路程的 pre_time 来计算出当前这段路程需要花费的时间
对于任意一段 position[i] ~ position[i+1] 路程来说,它所需要的时间只和当前索引 i 对应的 time 有关,一旦确定了是否删除当前索引,就能计算出这段路程需要花费的时间

故我们有如下定义

  • d f s ( i , j , p r e _ t i m e , c u r _ t i m e ) dfs(i,j,pre\_time,cur\_time) dfs(i,j,pre_time,cur_time) 表示当前路程 time = cur_time,上一段路程 time = pre_time,剩余可删除索引为 j 个时,position[i] ~ position[n-1] 时所需的最少时间
    • 如果选择不删除当前索引,则 d f s ( i , j , p r e _ t i m e , c u r _ t i m e ) = d f s ( i + 1 , j , c u r _ t i m e , t i m e [ i + 1 ] ) + ( p o s i t i o n [ i + 1 ] − p o s i t i o n [ i ] ) × c u r _ t i m e dfs(i,j,pre\_time,cur\_time)=dfs(i+1,j,cur\_time,time[i+1])+(position[i+1]-position[i])\times cur\_time dfs(i,j,pre_time,cur_time)=dfs(i+1,j,cur_time,time[i+1])+(position[i+1]position[i])×cur_time
    • 如果选择删除当前索引,则 d f s ( i , j , p r e _ t i m e , c u r _ t i m e ) = d f s ( i + 1 , j − 1 , p r e _ t i m e , c u r _ t i m e + t i m e [ i + 1 ] ) + ( p o s i t i o n [ i + 1 ] − p o s i t i o n [ i ] ) × p r e _ t i m e dfs(i,j,pre\_time,cur\_time)=dfs(i+1,j-1,pre\_time,cur\_time+time[i+1])+(position[i+1]-position[i])\times pre\_time dfs(i,j,pre_time,cur_time)=dfs(i+1,j1,pre_time,cur_time+time[i+1])+(position[i+1]position[i])×pre_time
    • 上诉两种情况去 min 返回
  • i == n - 1 时,到达终点,返回 0
  • 答案返回 d f s ( 1 , k , t i m e [ 0 ] , t i m e [ 1 ] ) + ( p o s i t i o n [ 1 ] − p o s i t i o n [ 0 ] ) × t i m e [ 0 ] dfs(1,k,time[0],time[1])+(position[1]-position[0])\times time[0] dfs(1,k,time[0],time[1])+(position[1]position[0])×time[0],因为 i = 0 的索引不能被删除,可以单独计算(或者也可以放入 dfs 中写一个逻辑处理 i = 0 的情况,此时应该返回 d f s ( 0 , k , 0 , t i m e [ 0 ] ) dfs(0,k,0,time[0]) dfs(0,k,0,time[0]) )

代码如下

// C++
class Solution {
public:int minTravelTime(int l, int n, int k, vector<int>& position, vector<int>& time) {// 6 | 4 | 7 | 7// 这里用哈希进行记忆化,分别计算出 i、j、pre、cur 所需要的比特位,将他们拼接成 int 当作 key 来使用unordered_map<int,int> memo;auto dfs = [&](this auto&& dfs, int i, int j, int pre, int cur)->int{if(i == n - 1){return j == 0 ? 0 : INT_MAX / 2;}int mask = i << 18 | j << 14 | pre << 7 | cur;if(memo.count(mask)) return memo[mask];int res = dfs(i + 1, j, cur, time[i+1]) + cur * (position[i + 1] - position[i]);if(j){res = min(res, dfs(i + 1, j - 1, pre, cur + time[i+1]) + pre * (position[i + 1] - position[i]));}return memo[mask] = res;};// 将 i = 0 的逻辑放在外面return dfs(1, k, time[0], time[1]) + time[0] * (position[1] - position[0]);}
};class Solution {
public:int minTravelTime(int l, int n, int k, vector<int>& position, vector<int>& time) {// 6 | 4 | 7 | 7unordered_map<int,int> memo;auto dfs = [&](this auto&& dfs, int i, int j, int pre, int cur)->int{if(i == n - 1){return j == 0 ? 0 : INT_MAX / 2;}int mask = i << 18 | j << 14 | pre << 7 | cur;if(memo.count(mask)) return memo[mask];int res = dfs(i + 1, j, cur, time[i+1]) + cur * (position[i + 1] - position[i]);if(j && i){ // 将 i = 0 的逻辑放在里面res = min(res, dfs(i + 1, j - 1, pre, cur + time[i+1]) + pre * (position[i + 1] - position[i]));}return memo[mask] = res;};return dfs(0, k, 0, time[0]);}
};
# Python
class Solution:def minTravelTime(self, l: int, n: int, k: int, position: List[int], time: List[int]) -> int:@cachedef dfs(i: int, j: int, pre: int, cur: int)->int:if i == n - 1:return 0 if j == 0 else infres = dfs(i + 1, j, cur, time[i+1]) + (position[i+1] - position[i]) * curif i and j:res = min(res, dfs(i + 1, j - 1, pre, cur + time[i+1]) + (position[i+1] - position[i]) * pre)return resreturn dfs(0, k, 0, time[0])

四、魔法序列的数组乘积之和

在这里插入图片描述
思路:

  • 给定一个 seq 序列,如何计算出它对答案的贡献?

    • 假设给定 seq = [0,0,0,1,1,2,2,2]
    • 根据题目要求,它对答案的贡献为 n u m s [ 0 ] 3 × n u m s [ 1 ] 2 × n u m s [ 2 ] 3 nums[0]^3 \times nums[1]^2\times nums[2]^3 nums[0]3×nums[1]2×nums[2]3
    • 同时,由于 seq 序列的数据顺序不同,被认定为不同的序列,根据排列组合,则包含这些元素的 seq 序列对于答案的贡献为 8 ! 3 ! × 2 ! × 3 ! × n u m s [ 0 ] 3 × n u m s [ 1 ] 2 × n u m s [ 2 ] 3 = 8 ! × n u m s [ 0 ] 3 3 ! × n u m s [ 1 ] 3 2 ! × n u m s [ 2 ] 3 3 ! \frac{8!}{3! \times 2! \times 3!}\times nums[0]^3 \times nums[1]^2\times nums[2]^3=8!\times \frac{nums[0]^3}{3!}\times \frac{nums[1]^3}{2!} \times \frac{nums[2]^3}{3!} 3!×2!×3!8!×nums[0]3×nums[1]2×nums[2]3=8!×3!nums[0]3×2!nums[1]3×3!nums[2]3
    • 也就是说,我们可以单独计算每一个 n u m s [ i ] c c ! \frac{nums[i]^c}{c!} c!nums[i]c,然后将它们相乘得到答案
    • 故对于 seq 来说,只要我们确定了它标定了几个 n u m s [ i ] nums[i] nums[i],就能计算出它的贡献
  • 考虑如何得到序列 seq,使得 popcount(sum(2^seq[i])) == K ?

    • 难点在于,相同二进制位置的 1 相加会产生进位,我们无法只通过一个参数来直接确定还需要多少二进制数位的 1
    • 如果我们直接暴力计算出 s = sum(2^seq[i]),然后在选完所有 seq 序列的数字后,求 popcount(s),进行判断,就会爆内存,因为 s 很大
    • 如何做?
      • 性质:只要我们从低到高枚举二级制数位的 1 进行选择,就会发现 +Nx2^i 不会影响低位的二进制数位的 1 的数量
      • 所以我们只要关心统计从二进制数位 i 开始往后的高位上的二级制数即可,这样我们记录的 s 的个数就会大大减小,具体见代码

代码如下

// C++
constexpr int MOD = 1e9 + 7;
constexpr int MX = 31;
long long POW(long long x, long long y){long long res = 1;while(y){if(y & 1) res = res * x % MOD;x = x * x % MOD;y >>= 1;}return res;
}
vector<long long> F(MX), INV_F(MX);
int init = []{F[0] = 1;for(int i = 1; i < MX; i++){F[i] = F[i - 1] * i % MOD;}// 计算逆元INV_F.back() = POW(F.back(), MOD - 2);for(int i = MX - 1; i > 0; i--){INV_F[i - 1] = INV_F[i] * i % MOD;}return 0;
}();
class Solution {
public:int magicalSum(int m, int K, vector<int>& nums) {int n = nums.size();vector pow_(n, vector<int>(m + 1));for(int i = 0; i < n; i++){pow_[i][0] = 1;for(int j = 1; j <= m; j++){pow_[i][j] = 1LL * pow_[i][j-1] * nums[i] % MOD;}}vector memo(n, vector(m+1, vector(K+1, vector<int>(m/2+1, -1))));// i : 从低到高枚举二进制数位// j : 剩余要选的 seq 的元素个数// k : 剩余要得到的二进制 1 的个数// s : sum(2^seq[0...i])>>iauto dfs = [&](this auto&& dfs, int i, int j, int k, int s)->int{int c1 = popcount((unsigned) s);if(c1 + j < k){return 0;}if(i == n || j == 0 || k == 0){return j == 0 && c1 == k;}if(memo[i][j][k][s] != -1) return memo[i][j][k][s];int res = 0;for(int c = 0; c <= j; c++){res = (res + 1LL * dfs(i + 1, j - c, k - ((s + c) & 1), s + c >> 1) * pow_[i][c] % MOD * INV_F[c] % MOD) % MOD;}return memo[i][j][k][s] = res;};return F[m] * dfs(0, m, K, 0) % MOD;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/80315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Azure Document Intelligence

Azure Document Intelligence(以前称为 Form Recognizer)是一项云服务&#xff0c;可用于从文档中提取文本、键值对、表等信息。下面是一个使用 Python SDK 进行文档转换和提取信息的基本示例。 1. 安装依赖 首先&#xff0c;你需要安装 azure-ai-formrecognizer 库&#xff0c…

51单片机快速成长路径

作为在嵌入式领域深耕18年的工程师&#xff0c;分享一条经过工业验证的51单片机快速成长路径&#xff0c;全程干货无注水&#xff1a; 一、突破认知误区&#xff08;新手必看&#xff09; 不要纠结于「汇编还是C」&#xff1a;现代开发90%场景用C&#xff0c;掌握指针和内存管…

SQLite数据库加密(Java语言、python语言)

1. 背景与需求 SQLite 是一种轻量级的关系型数据库,广泛应用于嵌入式设备、移动应用、桌面应用等场景。为了保护数据的隐私与安全,SQLite 提供了加密功能(通过 SQLCipher 扩展)。在 Java 中,可以使用 sqlite-jdbc 驱动与 SQLCipher 集成来实现 SQLite 数据库的加密。 本…

《AI大模型应知应会100篇》第53篇:Hugging Face生态系统入门

第53篇&#xff1a;Hugging Face生态系统入门 ——从模型获取到部署的全流程实战指南 &#x1f4cc; 摘要 在人工智能快速发展的今天&#xff0c;Hugging Face已成为自然语言处理&#xff08;NLP&#xff09;领域最具影响力的开源平台之一。它不仅提供丰富的预训练模型、强大…

什么是向量数据库?向量数据库和关系数据库有什么区别?

什么是向量数据库&#xff1f; 向量数据库是一种专门设计用来存储、索引和查询向量数据的数据库系统。在当今的人工智能和机器学习领域中&#xff0c;向量数据库变得越来越重要&#xff0c;尤其是在处理高维数据如图像、音频和文本等非结构化数据时。 主要用途 相似度搜索&…

关于甲骨文(oracle cloud)丢失MFA的解决方案

前两年&#xff0c;申请了一个招商的多币种信用卡&#xff0c;然后就从网上撸了一个oracle的免费1h1g的服务器。 用了一段时间&#xff0c;人家要启用MFA验证。 啥叫MFA验证&#xff0c;类似与短信验证吧&#xff0c;就是绑定一个手机&#xff0c;然后下载一个app&#xff0c;每…

基于Arduino Nano的DIY示波器

基于Arduino Nano的DIY示波器&#xff1a;打造属于你的口袋实验室 前言 在电子爱好者的世界里&#xff0c;示波器是不可或缺的工具之一。它能够帮助我们观察和分析各种电子信号的波形&#xff0c;从而更好地理解和调试电路。然而&#xff0c;市面上的示波器价格往往较高&…

LeetCode 解题思路 47(最长回文子串、最长公共子序列)

解题思路&#xff1a; dp 数组的含义&#xff1a; dp[i][j] 是否为回文子串。递推公式&#xff1a; dp[i][j] s.charAt(i) s.charAt(j) && dp[i 1][j - 1]。dp 数组初始化&#xff1a; 单字符 dp[i][i] true&#xff0c;双字符 dp[i][i 1] s.charAt(i) s.charA…

通过管道实现C++ Linux独立进程之间的通信和字符串传递

在Linux环境下&#xff0c;独立进程之间的通信&#xff08;IPC&#xff09;可以通过多种方式实现&#xff0c;包括管道、消息队列、共享内存和套接字。本文将详细介绍如何使用管道&#xff08;pipe&#xff09;在C中实现独立进程之间的通信&#xff0c;并传递字符串。 一、管道…

神经网络极简入门技术分享

1. 引言 神经网络是深度学习的基础&#xff0c;其设计灵感来源于人脑神经元的结构和工作方式。尽管现代神经网络已经变得异常复杂&#xff0c;但其核心原理却相对简单易懂。本报告旨在通过剖析神经网络的最基本单元——神经元&#xff0c;帮助初学者理解神经网络的工作原理。 …

五、Hadoop集群部署:从零搭建三节点Hadoop环境(保姆级教程)

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月7日 专栏&#xff1a;Hadoop教程 前言&#xff1a; 想玩转大数据&#xff0c;Hadoop集群是绕不开的一道坎。很多小伙伴一看到集群部署就头大&#xff0c;各种配置、各种坑。别慌&#xff01;这篇教程就是你的“救生圈”。 …

科研项目管理:4款高效工具推荐与效率提升实践

一般来说&#xff0c;科研项目往往涉及复杂的任务、跨部门协作以及严格的时间和预算限制。传统的管理方式&#xff0c;如电子表格或邮件沟通&#xff0c;难以应对多任务并行、资源分配复杂的需求。借助现代项目管理工具&#xff0c;研究人员能够优化工作流程、提升团队协作效率…

如何统一修改word中所有英文字母的字体格式

1.需求分析 我想让整篇论文中的所有英文字母格式都修改为Time New Roman格式。 2.直观操作流程 点击左上角开始 --> 点击替换 --> 点击更多 --> 点击特殊格式 --> 选择查找内容为任意字母(Y) --> 将光标点到替换内容 --> 点击格式 --> 点击字体 --> …

【疑难杂症2025-003】Java-mvn项目在gitlab-ci构建镜像时遇到的问题和解决方案

本文由Markdown语法编辑器编辑完成&#xff0e; 1.背景: 之前从同事手里接手了一个java的项目&#xff0c;是用maven构建项目的&#xff0e;由于我们的服务都是基于docker来部署的&#xff0c;因此这个java项目也是要编译成docker image然后发布&#xff0e;但是之前一直都是…

【RT-Thread Studio】nor flash配置Fal分区

前置条件&#xff1a;【RT-Thread Studio】W25Q128配置 添加 FAL软件包 配置SFUD驱动程序&#xff0c;使用FAL的设备为W25Q128 将fal_cfg.h和fal_flash_sfud_port.c提取出来&#xff0c;放到自己创建的fal_porting目录。 修改 fal_flash_sfud_port.c struct fal_flash_dev n…

Spring MVC 视图解析器 (ViewResolver) 如何配置? Spring Boot 是如何自动配置常见视图解析器的?

我们来详细分析一下视图解析器 (ViewResolver) 的配置以及 Spring Boot 是如何自动配置它们的。 视图解析器 (ViewResolver) 是什么&#xff1f; 在 Spring MVC 中&#xff0c;当控制器 (Controller) 方法处理完请求并返回一个逻辑视图名 (String) 时&#xff0c;DispatcherS…

理解网站导航文件:robots.txt、sitemap.xml与LLMs.txt的全面解析

在当今数字化时代&#xff0c;网站不仅需要为人类用户提供良好的浏览体验&#xff0c;还需要考虑搜索引擎和人工智能系统的可访问性。本文将深入探讨三种关键的网站导航文件&#xff1a;传统的robots.txt和sitemap.xml&#xff0c;以及新兴的LLMs.txt&#xff0c;分析它们的功能…

leetcode 349. Intersection of Two Arrays

题目描述 题目限制0 < nums1[i], nums2[i] < 1000&#xff0c;所以可以开辟一个1001个元素的数组来做哈希表。 class Solution { public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {vector<int> table(1001,0…

【软件工程】软件多缺陷定位方法总结

软件多缺陷定位(Multi-Fault Localization)是软件工程中的一个重要研究方向,旨在同时定位代码中存在的多个缺陷(Bug)。由于多个缺陷可能相互干扰(如掩盖错误行为),导致传统单缺陷定位方法效果下降,因此需要针对多缺陷场景的特殊性设计方法。以下是常见的多缺陷定位方法…

【数据结构入门训练DAY-30】数的划分

文章目录 前言一、题目二、解题思路结语 前言 本次训练内容 训练DFS。训练解题思维。 一、题目 将整数n分成k份&#xff0c;且每份不能为空&#xff0c;任意两份不能相同(不考虑顺序)。 例如&#xff1a;n7&#xff0c;k3&#xff0c;下面三种分法被认为是相同的。 {1&a…