LeetCode --- 435周赛

题目列表

3442. 奇偶频次间的最大差值 I
3443. K 次修改后的最大曼哈顿距离
3444. 使数组包含目标值倍数的最少增量
3445. 奇偶频次间的最大差值 II

一、奇偶频次间的最大差值I

奇偶频次间的最大差值 I
统计字母出现次数,然后分别统计出现偶数次的最小值和出现奇数次的最大值,将两者相减即可,代码如下

// c++
class Solution {
public:int maxDifference(string s) {int cnt[26]{};int mx = 0, mn = INT_MAX;for(auto e : s) cnt[e-'a']++;for(auto x : cnt){if(x){if(x & 1) mx = max(mx, x);else mn = min(mn, x);}}return mx - mn;}
};
# python
class Solution:def maxDifference(self, s: str) -> int:cnt = Counter(s)max1 = max(c for c in cnt.values() if c % 2 == 1)min0 = min(c for c in cnt.values() if c % 2 == 1)return max1 - min0

二、K 次修改后的最大曼哈顿距离

K 次修改后的最大曼哈顿距离
求在移动的过程中,距离原点的最大曼哈顿距离,并且我们可以改变 k k k 次移动的方向。我们可以计算出每一个时刻距离原点的最大距离,取 m a x max max 即为答案

  • 对于任意时刻,我们所在的位置和之前移动方向的顺序无关,只和四个方向的移动次数有关,比如已知:向 N N N 走了 5 5 5 步,向 S S S 走了 2 2 2 步,向 E E E 走了 6 6 6 步,向 W W W 走了 3 3 3 步,则当前位置坐标为 ( + 5 − 2 , + 6 − 3 ) = ( 3 , 3 ) (+5-2,+6-3)=(3,3) (+52,+63)=(3,3),曼哈顿距离为 ∣ 3 ∣ + ∣ 3 ∣ = 6 |3|+|3|=6 ∣3∣+∣3∣=6。故只要统计四个方向的移动次数即可
  • 如何改变移动方向,才能让曼哈顿距离变大?减少相反方向的移动次数,比如向 N N N 5 5 5 步,向 S S S 3 3 3 步,显然我们要让向 S S S 的移动次数变小,向 N N N 的移动次数变多。即对于两个相反方向来说,我们改变移动次数少的方向

代码如下

// c++
class Solution {
public:int maxDistance(string s, int k) {int n = s.size(), ans = 0;int f[4]{};for(auto e : s){// 统计四个方向上的移动次数switch(e){case 'N': f[0]++; break;case 'S': f[1]++; break;case 'E': f[2]++; break;case 'W': f[3]++; break;}// cnt 表示改变移动方向后,会使得答案更大的移动次数,即统计相反方向上移动次数更小的移动次数int cnt = min(f[0], f[1]) + min(f[2], f[3]);// res 表示不考虑 cnt 的最大曼哈顿距离int res = max(f[0], f[1]) + max(f[2], f[3]);// min(cnt, k) 表示可修改移动方向的移动次数,max(cnt, k) - k 表示不可修改的移动次数ans = max(ans, res + min(cnt, k) - (max(cnt, k) - k));}return ans;}
};
# python
class Solution:def maxDistance(self, s: str, k: int) -> int:n = len(s)f = defaultdict(int)ans = 0for x in s:f[x] += 1a = max(f['N'], f['S']) + max(f['E'], f['W'])b = min(f['N'], f['S']) + min(f['E'], f['W'])ans = max(ans, a + min(b, k) - (max(b, k) - k))return ans

三、使数组包含目标值倍数的最少增量

使数组包含目标值倍数的最少增量
在这里插入图片描述
为了让 t a r g e t target target 中的每个元素在 n u m s nums nums 中至少有一个倍数存在,我们需要让 n u m s nums nums 中的某些数成为 t a r g e t target target 中一个数或多个数的倍数。

  • 为了保证操作次数最少,我们进行操作的数必然要成为 t a r g e t target target 中一个数或多个数的倍数,故我们可以采用选或不选的思路考虑
    • 由于 t a r g e t target target 的最多有 4 4 4 个数,我们可以预处理出不同数字组合的公倍数,如 [ 2 , 3 , 4 ] [2,3,4] [2,3,4],我们可以计算出 [ 2 ] 、 [ 3 ] 、 [ 4 ] 、 [ 2 , 3 ] 、 [ 2 , 4 ] 、 [ 3 , 4 ] 、 [ 2 , 3 , 4 ] [2]、[3]、[4]、[2,3]、[2,4]、[3,4]、[2,3,4] [2][3][4][2,3][2,4][3,4][2,3,4] 这些集合数字的公倍数。可以用动态规划 + + +位运算来解决

      • f [ m a s k ] f[mask] f[mask] 表示 m a s k mask mask 中二进制为 1 1 1 的数字集合的公倍数
      • f [ m a s k ∣ 1 < < i ] = l c m ( f [ m a s k ] , t a r g e t [ i ] ) f[mask|1<<i] = lcm(f[mask],target[i]) f[mask∣1<<i]=lcm(f[mask],target[i]),其中 l c m lcm lcm 为求两个数的最小公倍数的函数
    • 对于任意一个数 n u m s [ i ] nums[i] nums[i],如果我们选择它,则让它成为 t a r g e t target target 中一个数或多个数的倍数,即 f [ s u b ] f[sub] f[sub] 的倍数,其中 s u b sub sub 表示 t a r g e t target target 中部分数字的集合。如果不选,则考虑让剩下的数字

      • 故我们定义 d p [ i ] [ j ] dp[i][j] dp[i][j] 表示前 i i i 个数让 j j j 的二进制集合中的数字都有倍数的最小操作次数
      • 不选 n u m s [ i ] nums[i] nums[i] d p [ i ] [ j ] = d p [ i − 1 ] [ j ] dp[i][j] = dp[i-1][j] dp[i][j]=dp[i1][j]
      • n u m s [ i ] nums[i] nums[i] d p [ i ] [ j ] = m i n ( d p [ i − 1 ] [ j − s u b ] + ( l − n u m s [ i ] % l ) % l ) dp[i][j] = min(dp[i-1][j-sub] + (l-nums[i]\%l)\%l) dp[i][j]=min(dp[i1][jsub]+(lnums[i]%l)%l),其中 s u b sub sub j j j 的子集, l = f [ s u b ] l=f[sub] l=f[sub] 表示 s u b sub sub 集合的最小公倍数
      • ( l − n u m s [ i ] % l ) % l (l-nums[i]\%l)\%l (lnums[i]%l)%l 计算 n u m s [ i ] nums[i] nums[i] 变成 l l l 的倍数的最少操作次数

代码如下

// c++
class Solution {
public:int minimumIncrements(vector<int>& nums, vector<int>& target) {int n = nums.size(), m = target.size();vector<long long> lcms(1<<m);lcms[0] = 1;for(int i = 0; i < m; i++){int bit = 1 << i;for(int mask = 0; mask < bit; mask++){lcms[mask|bit] = lcm(lcms[mask], target[i]);}}vector f(n + 1, vector<long long>(1 << m));for(int j = 1; j < (1<<m); j++) f[0][j] = LLONG_MAX/2;for(int i = 0; i < n; i++){for(int j = 0; j < (1<<m); j++){f[i+1][j] = f[i][j];for(int sub = j; sub; sub = (sub - 1) & j){ // 枚举 j 的子集long long l = lcms[sub];f[i+1][j] = min(f[i+1][j], f[i][j-sub] + (l - nums[i]%l)%l);}}}return f[n][(1<<m)-1];}
};
#python
class Solution:def minimumIncrements(self, nums: List[int], target: List[int]) -> int:n = len(nums)m = len(target)lcms = [0] * (1 << m)lcms[0] = 1for i in range(m):bit = 1 << ifor mask in range(bit):lcms[mask | bit] = lcm(lcms[mask], target[i])f = [[0]*(1<<m) for _ in range(n + 1)]for j in range(1, 1<<m):f[0][j] = inffor i in range(n):for j in range(1<<m):f[i+1][j] = f[i][j]sub = jwhile sub:l = lcms[sub]f[i+1][j] = min(f[i+1][j], f[i][j-sub] + (l - nums[i]%l)%l)sub = (sub - 1) & jreturn f[n][(1<<m)-1]

四、奇偶频次间的最大差值 II

在这里插入图片描述
在这里插入图片描述

本题的思路如下

  • 由于 s s s 中最多有 5 5 5 中数字字符,可以两重循环暴力枚举 a 、 b a、b ab 两个字符 ( a ! = b ) (a!=b) (a!=b)

  • 在不考虑奇偶性的情况下,求 [ l , r ] [l,r] [l,r] 区间内出现次数之差的最大值,我们可以用前缀和快速计算出区间内字符 a 、 b a、b ab 的出现次数,在相减得 p r e a [ r ] − p r e a [ l − 1 ] − ( p r e b [ r ] − p r e b [ l − 1 ] ) = p r e a [ r ] − p r e b [ r ] − ( p r e a [ l − 1 ] − p r e b [ l − 1 ] ) pre_a[r]-pre_a[l-1]-(pre_b[r]-pre_b[l-1])=pre_a[r]-pre_b[r]-(pre_a[l-1]-pre_b[l-1]) prea[r]prea[l1](preb[r]preb[l1])=prea[r]preb[r](prea[l1]preb[l1]),对于这样的式子,我们可以边计算 p r e a 、 p r e b pre_a、pre_b preapreb,边跟新 p r e a − p r e b pre_a-pre_b preapreb 的最小值,同时跟新答案

  • 如何考虑奇偶性?定义一个数组 d i f f [ 2 ] [ 2 ] diff[2][2] diff[2][2] 记录前 i i i p r e a − p r e b pre_a-pre_b preapreb 的最小值

    • d i f f [ 0 ] [ 0 ] diff[0][0] diff[0][0] 表示 p r e a pre_a prea 为偶数, p r e b pre_b preb 为偶数的情况
    • d i f f [ 0 ] [ 1 ] diff[0][1] diff[0][1] 表示 p r e a pre_a prea 为偶数, p r e b pre_b preb 为奇数的情况
    • d i f f [ 1 ] [ 0 ] diff[1][0] diff[1][0] 表示 p r e a pre_a prea 为奇数, p r e b pre_b preb 为偶数的情况
    • d i f f [ 1 ] [ 1 ] diff[1][1] diff[1][1] 表示 p r e a pre_a prea 为奇数, p r e b pre_b preb 为奇数的情况
    • 如此一来,我们就能根据当前 p r e a 、 p r e b pre_a、pre_b preapreb 的奇偶性,来匹配合适的最小值 d i f f [ p ] [ q ] diff[p][q] diff[p][q],其中 p = 1 − p r e a % 2 , q = p r e b % 2 p=1-pre_a\%2,q=pre_b\%2 p=1prea%2q=preb%2
  • 注意:题目要求区间内字符 a 、 b a、b ab 的出现次数不能为 0 0 0,所以我们要保证 p r e [ r ] − p r e [ l − 1 ] ! = 0 pre[r]-pre[l-1]!=0 pre[r]pre[l1]!=0,即 p r e [ r ] ! = p r e [ l − 1 ] pre[r]!=pre[l-1] pre[r]!=pre[l1],由于 p r e pre pre 数组是递增的,则 p r e [ r ] > p r e [ l − 1 ] pre[r]>pre[l-1] pre[r]>pre[l1],同时题目要求区间长度 ≥ k \geq k k,我们可以用类似滑动窗口的思想更新 d i f f diff diff 数组,具体见代码

代码如下

// c++
class Solution {
public:int maxDifference(string s, int k) {int n = s.size();int ans = INT_MIN;for(int a = 0; a < 5; a++){for(int b = 0; b < 5; b++){if(a == b) continue;vector diff(2, vector<int>(2, INT_MAX));vector<int> cnta(n + 1), cntb(n + 1);for(int i = 0, j = 0; i < n; i++){int x = s[i] - '0';cnta[i + 1] = cnta[i] + (x == a);cntb[i + 1] = cntb[i] + (x == b);// 跟新 diff 最小值,保证 区间长度 >= k && 字符a、b的出现次数 > 0while(i - j + 1 >= k && cnta[j] < cnta[i+1] && cntb[j] < cntb[i+1]){int p = cnta[j] % 2, q = cntb[j] % 2;diff[p][q] = min(diff[p][q], cnta[j] - cntb[j]);j++;}if(i >= k - 1){int p = 1 - cnta[i+1] % 2, q = cntb[i+1] % 2;if(diff[p][q] < INT_MAX){ans = max(ans, cnta[i+1] - cntb[i+1] - diff[p][q]);}}}}}return ans;}
};
# python
class Solution:def maxDifference(self, s: str, k: int) -> int:n = len(s)ans = -inffor a in range(5):for b in range(5):if a == b:continuediff = [[inf, inf], [inf, inf]]cnta, cntb = [0]*(n+1), [0]*(n+1)j = 0for i in range(n):x = ord(s[i]) - ord('0')cnta[i+1] = cnta[i] + (x == a)cntb[i+1] = cntb[i] + (x == b)while i - j + 1 >= k and cnta[j] < cnta[i+1] and cntb[j] < cntb[i+1]:p, q = cnta[j] % 2, cntb[j] % 2diff[p][q] = min(diff[p][q], cnta[j]-cntb[j])j += 1if i >= k - 1:p, q = 1 - cnta[i+1] % 2, cntb[i+1] % 2if diff[p][q] < inf:ans = max(ans, cnta[i+1] - cntb[i+1] - diff[p][q])return ans

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

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

相关文章

chrome-mojo C++ Bindings API

概述 Mojo C 绑定 API 利用C 系统 API提供一组更自然的原语&#xff0c;用于通过 Mojo 消息管道进行通信。结合从Mojom IDL 和绑定生成器生成的代码&#xff0c;用户可以轻松地跨任意进程内和进程间边界连接接口客户端和实现。 本文档通过示例代码片段提供了绑定 API 用法的详…

目标检测数据集合集(持续更新中)

第1期 高压输电线塔鸟巢数据集 第2期 特种工程车辆检测数据集 第3期 金桔目标检测数据集 第4期 金属锈蚀识别检测数据集 第5期 苦瓜目标检测数据集 第6期 石榴目标检测数据集YOLO格式 第7期 光伏电池板缺陷检测数据集YOLO格式 第8期 铁路轨道异物入侵检测数据集YOLO格式…

活动预告 | 为 AI 新纪元做好准备:助力安全的业务转型

课程介绍 随着现代办公模式的不断演变和 AI 技术的迅速发展&#xff0c;企业在享受效率提升的同时&#xff0c;也面临着信息安全与数据保护的严峻挑战。在利用 AI 技术释放业务潜力的同时&#xff0c;如何确保数据质量与安全已成为企业发展的关键议题。 在本次线上课程中&…

语义分割文献阅读——SETR:使用Transformer从序列到序列的角度重新思考语义分割

目录 摘要 Abstract 1 引言 2 Vision Transformer(ViT) 2.1 图片预处理&#xff1a;分块和降维 2.2 Patch Embedding 2.3 位置编码 2.4 Transformer Encoder的前向过程 3 SETR 3.1 图像序列化处理 3.2 Transformer 3.3 解码器 总结 摘要 本周阅读的论文题目是《R…

深度学习入门--python入门1

以前学的python全部还给老师了&#xff0c;所以现在重新开始学习了。目标是每天至少学习一点点吧。 目录 1.1 python是什么 1.2 python安装 1.3 python解释器 1.3.1 算术计算 1.3.2 数据类型 1.3.3 变量 1.3.4 列表&#xff08;数组&#xff09; 1.3.5 字典 1.3.6 布…

【2024最新Java面试宝典】—— SpringBoot面试题(44道含答案)_java spingboot 面试题

37. 如何重新加载 Spring Boot 上的更改&#xff0c;而无需重新启动服务器&#xff1f;Spring Boot项目如何热部署&#xff1f;38. SpringBoot微服务中如何实现 session 共享 ?39. 您使用了哪些 starter maven 依赖项&#xff1f;40. Spring Boot 中的 starter 到底是什么 ?4…

【动态规划】风扫枯杨,满地堆黄叶 - 9. 完全背包问题

本篇博客给大家带来的是完全背包问题之动态规划解法技巧. &#x1f40e;文章专栏: 动态规划 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅&#x1f680; 要开心要快乐顺…

python-leetcode-单词搜索

79. 单词搜索 - 力扣&#xff08;LeetCode&#xff09; class Solution:def exist(self, board: List[List[str]], word: str) -> bool:if not board or not board[0]:return Falserows, cols len(board), len(board[0])def backtrack(r, c, index):if index len(word):re…

游戏引擎学习第98天

仓库:https://gitee.com/mrxiao_com/2d_game_2 开始进行一点回顾 今天的目标是继续实现正常贴图的操作&#xff0c;尽管目前我们还没有足够的光照信息来使其完全有用。昨日完成了正常贴图相关的基础工作&#xff0c;接下来将集中精力实现正常贴图的基本操作&#xff0c;并准备…

PH热榜 | 2025-02-10

1. 2pr 标语&#xff1a;人工智能帮你把想法变成LinkedIn爆款 或者更口语化一点&#xff1a; AI帮你把点子变成LinkedIn上的热门帖子 介绍&#xff1a;用AI主持的访谈&#xff0c;把你的想法变成LinkedIn爆款帖子。录制你的想法&#xff0c;让AI帮你创作个性化、引人入胜的…

django配置跨域

1、第一种 from django.views.decorators.csrf import csrf_exemptcsrf_exempt第二种 安装 pip install django-cors-headers在配置文件settings.py进入 INSTALLED_APPS [..."corsheaders", # 添加 ]MIDDLEWARE [corsheaders.middleware.CorsMiddleware, # 添加…

使用C语言实现MySQL数据库的增删改查操作指南

使用C语言与MySQL数据库进行交互,通常涉及使用MySQL提供的C API库。这套API允许开发者在C/C++程序中执行SQL查询,从而实现数据库的增删改查操作。下面,我将详细介绍如何在C语言中实现这些基本操作。 准备工作 安装MySQL开发库:确保你的系统上安装了MySQL服务器以及MySQL开发…

25考研电子信息复试面试常见核心问题真题汇总,电子信息考研复试没有项目怎么办?电子信息考研复试到底该如何准备?

你是不是在为电子信息考研复试焦虑&#xff1f;害怕被老师问到刁钻问题、担心专业面答不上来&#xff1f;别慌&#xff01;作为复试面试92分逆袭上岸的学姐&#xff0c;今天手把手教你拆解电子信息类复试通关密码&#xff01;看完这篇&#xff0c;让你面试现场直接开大&#xf…

vite + axios 代理不起作用 404 无效

vite axios 代理不起作用 先看官方示例 export default defineConfig({server: {proxy: {// 字符串简写写法/foo: http://localhost:4567,// 选项写法/api: {target: http://jsonplaceholder.typicode.com,changeOrigin: true,rewrite: (path) > path.replace(/^\/api/, )…

【设计模式】【行为型模式】模板方法模式(Template Method)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f4eb; 欢迎V&#xff1a; flzjcsg2&#xff0c;我们共同讨论Java深渊的奥秘 &#x1f…

基础设施在平台工程中的作用

平台工程侧重于设计和构建自助服务工具和环境&#xff0c;以简化软件开发和部署。通过简化和隐藏底层系统的复杂性&#xff0c;我们可以将精力集中在提供有意义的价值上。 从传统的 IT 运营过渡到集成的 DevOps 基础设施实践优先考虑团队合作、简化的流程和持续交付&#xff0…

Unity3D实现显示模型线框(shader)

系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、效果展示👉二、第一种方式👉二、第二种方式👉壁纸分享👉总结👉前言 在 Unity 中显示物体线框主要基于图形渲染管线和特定的渲染模式。 要显示物体的线框,通常有两种常见的方法:一种是利用内置的渲染…

活动预告 |【Part1】Microsoft Azure 在线技术公开课:AI 基础知识

课程介绍 参加“Azure 在线技术公开课&#xff1a;AI 基础知识”活动&#xff0c;了解 AI 核心概念。参加我们举办的本次免费培训活动&#xff0c;了解组织如何使用 AI 技术克服实际挑战&#xff0c;以及如何借助 Azure AI 服务构建智能应用程序。本次培训适用于任何对 AI 解决…

Hello Robot 推出Stretch 3移动操作机器人,赋能研究与商业应用

Hello Robot公司近日发布了其新一代开源移动操作机器人Stretch 3&#xff0c;这是一款高度灵活的机器人平台&#xff0c;专为机器人研究、教育实验和商业自动化设计。Stretch 3 结合了先进的移动机器人技术、灵巧操作能力和开源软件生态系统&#xff0c;为用户提供了一个功能强…

题解 洛谷 Luogu P1828 [USACO3.2] 香甜的黄油 Sweet Butter 最短路 堆优化Dijkstra Floyd C++

题目 传送门 P1828 [USACO3.2] 香甜的黄油 Sweet Butter - 洛谷 | 计算机科学教育新生态https://www.luogu.com.cn/problem/P1828 思路 以每头奶牛所在的牧场为起点&#xff0c;求得到全图各个点的最短距离 再枚举全图所有点&#xff0c;计算从所有起点到某点的距离之和&a…