Leetcode - 周赛435

目录

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

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

题目链接
在这里插入图片描述
本题使用数组统计字符串 s s s 中每个字符的出现次数,然后求出现次数为奇数的最大值和出现次数为偶数的最小值,将它们相减得到答案。

代码如下:

class Solution {public int maxDifference(String s) {int[] cnt = new int[26];for(char c : s.toCharArray()){cnt[c-'a']++;}int mx = 0, mn = Integer.MAX_VALUE;for(int x : cnt){if(x % 2 == 1){mx = Math.max(mx, x);}else if(x > 0){mn = Math.min(mn, x);}}return mx - mn;}
}

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

题目链接
在这里插入图片描述
曼哈顿距离求两个坐标点 ( x i , y i ) (x_i,y_i) (xi,yi) ( x j , y j ) (x_j,y_j) (xj,yj) 的横坐标距离绝对值与纵坐标距离绝对值之和,即 ∣ x i − x j ∣ + ∣ y i − y j ∣ |x_i-x_j|+|y_i-y_j| xixj+yiyj,也就是说,可以将横纵坐标分开来计算:

  • 对于 x x x 轴来说(东西方向):比如说,此时向东移动了 a a a 步,向西移动了 b b b 步, a > b a > b a>b,肯定是将向西移动转换成向东移动,才会使得它距离原点距离越远。假设转换了 d d d 次,此时距离原点的距离就变成了 a + d − ( b − d ) = a − b + 2 ∗ d a + d - (b - d) = a - b + 2 * d a+d(bd)=ab+2d,如果 a < b a < b a<b,那么就是 b − a + 2 ∗ d b-a+2*d ba+2d,所以一合并变成了 a b s ( a − b ) + 2 ∗ d abs(a-b)+2*d abs(ab)+2d,这里的 d = m i n ( a , b , k ) d=min(a,b,k) d=min(a,b,k) k = k − d k = k- d k=kd
  • 对于 y y y 轴来说(南北方向)也是同理.

代码如下:

class Solution {public int maxDistance(String s, int k) {String str = "NSWE";int[] f = new int[4];int ans = 0;for(char c : s.toCharArray()){f[str.indexOf(c)]++;int left = k - Math.min(Math.min(f[0], f[1]), k);int res = get(f[0], f[1], k) + get(f[2], f[3], left);ans = Math.max(ans, res);}return ans;}int get(int x, int y, int k){int a = Math.max(x, y);int b = Math.min(x, y);int d = Math.min(b, k);return a - b + 2 * d;}
}
//也可以换一个角度思考,设当前位置为(x,y):
//由上一种方法可知,每一次修改都会使得曼哈都距离增加 2,最多不会超过 i + 1
class Solution {public int maxDistance(String s, int k) {int ans = 0;int x = 0, y = 0;for(int i = 0; i < s.length(); i++){char c = s.charAt(i);if(c == 'N') y++;else if(c == 'S') y--;else if(c == 'W') x--;else x++;ans = Math.max(ans, Math.min(Math.abs(x) + Math.abs(y) + 2 * k, i + 1));}return ans;}
}

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

题目链接
在这里插入图片描述
对于 n u m s nums nums 数组中的任意一个元素来说,它可以成为 t a r g e t target target 数组中任意非空子集(从 t a r g e t target target 中任意选几个元素)的倍数,所以可以定义 d f s ( i , j ) dfs(i,j) dfs(i,j) [ 0 , i ] [0,i] [0,i] 满足集合 j j j 中所有倍数条件的最小操作次数(用集合 j = { x , y , z , . . . } j=\{x,y,z,...\} j={x,y,z,...} 表示 t a r g e t target target 数组中还剩下几个元素没有满足倍数条件)

如果从后往前遍历 n u m s nums nums 数组,对于 x = n u m s [ i ] x = nums[i] x=nums[i] 来说,它有选或不选两种情况:

  • 如果不选,即 x x x 不会进行递增操作,就不会变成集合 j j j 中任意元素的倍数,接下来问题变成前 i i i 个数满足集合 j j j 中所有元素倍数条件的最小操作次数,即 d f s ( i − 1 , j ) dfs(i-1,j) dfs(i1,j)
  • 如果选,即 x x x 会进行递增操作,就一定要变成集合 j j j 中任意非空子集的倍数,枚举集合 j j j 的所有非空子集 s u b sub sub,接下来问题变成前 i i i 个数满足集合 j − s u b j-sub jsub(即去除已选择的子集 s u b sub sub) 中所有元素倍数条件的最小操作次数,即 d f s ( i − 1 , j − s u b ) dfs(i-1,j-sub) dfs(i1,jsub)
  • d f s ( i , j ) = m i n ( d f s ( i − 1 , j ) , d f s ( i − 1 , j − s u b ) + o p e r a t i o n s ) dfs(i,j)=min(dfs(i-1,j),dfs(i-1,j-sub)+operations) dfs(i,j)=min(dfs(i1,j),dfs(i1,jsub)+operations) s u b ⊆ j sub\subseteq j subj o p e r a t i o n s operations operations 表示 n u m s [ i ] nums[i] nums[i] 变成 s u b sub sub 中所有元素的倍数的操作次数。

要计算 o p e r a t i o n s operations operations,需要先知道子集 s u b sub sub 中所有元素的最小公倍数,这里可以预处理出集合 j j j 所有子集的最小公倍数 l c m lcm lcm。这里介绍一个简单做法,定义 l c m s [ x ] lcms[x] lcms[x]:集合 x x x 中所有元素的最小公倍数。从小到大枚举集合 j j j 子集的大小,令 b i t = 1 < < i bit = 1<<i bit=1<<i,枚举所有大小小于 i i i 的子集 m a s k mask mask,可以得到 f [ b i t ∣ m a s k ] = l c m ( f [ m a s k ] , t a r g e t [ i ] ) f[bit | mask] = lcm(f[mask],target[i]) f[bitmask]=lcm(f[mask],target[i])

l = l c m s [ s u b ] l = lcms[sub] l=lcms[sub] o p e r a t i o n s = ( l − n u m s [ i ] % l ) % l operations=(l-nums[i]\%l)\%l operations=(lnums[i]%l)%l

代码如下:

class Solution {long gcd(long x , long y){return y == 0 ? x : gcd(y, x % y); }long lcm(long x, long y){return x * y / gcd(x, y);}public int minimumIncrements(int[] nums, int[] target) {int n = target.length;//预处理 lcmslong[] lcms = new long[1<<n];lcms[0] = 1;for(int i=0; i<n; i++){int bit = 1 << i;for(int j=0; j<bit; j++){lcms[bit|j] = lcm(target[i], lcms[j]);}}int m = nums.length;memo = new long[m][1<<n];for(long[] r : memo) Arrays.fill(r, -1);return (int)dfs(m-1, (1<<n)-1, nums, lcms);}long[][] memo;long dfs(int i, int j, int[] nums, long[] lcms){if(j == 0) return 0;if(i < 0) return Long.MAX_VALUE/2;if(memo[i][j] != -1) return memo[i][j];long res = dfs(i-1, j, nums, lcms);int sub = j;//枚举 j 的子集while(sub > 0){long l = lcms[sub];res = Math.min(res, dfs(i-1, j^sub, nums, lcms) + (l - nums[i] % l) % l);sub = (sub - 1) & j;}return memo[i][j] = res;}
}//递推写法
class Solution {long gcd(long x , long y){return y == 0 ? x : gcd(y, x % y); }long lcm(long x, long y){return x * y / gcd(x, y);}public int minimumIncrements(int[] nums, int[] target) {int n = nums.length;int m = target.length;long[] lcms = new long[1<<m];lcms[0] = 1;for(int i = 0; i < m; i++){int bit = 1 << i;for(int mask = 0; mask < bit; mask++){lcms[bit | mask] = lcm(target[i], lcms[mask]);}}long[][] f = new long[n+1][1<<m];Arrays.fill(f[0], Long.MAX_VALUE/2);for(int i = 0; i < n; i++){f[i][0] = 0;for(int j = 0; j < 1 << m; j++){f[i+1][j] = f[i][j];for(int sub = j; sub != 0; sub = (sub - 1) & j){long l = lcms[sub];f[i+1][j] = Math.min(f[i+1][j], f[i][j^sub] + (l - nums[i] % l) % l);}}}return (int)f[n][(1<<m)-1];}
}

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

题目链接
在这里插入图片描述
题目中字符串 s s s 仅由数字 0 , 1 , 2 , 3 , 4 0,1,2,3,4 0,1,2,3,4 构成,所以可以枚举出现奇数次的字符 x x x 和出现偶数次的字符 y y y x ! = y x != y x!=y),求子串中两个字符出现的频次之差,就是求区间中字符 x x x y y y 的出现次数,然后相减。这个可以使用前缀和来进行计算:

假设数组 p r e x [ i + 1 ] pre_x[i+1] prex[i+1] 表示前 i i i 个元素中字符 x x x 的出现次数, p r e y [ i + 1 ] pre_y[i+1] prey[i+1] 表示前 i i i 个元素中字符 y y y 的出现次数,求区间 [ l , r ] [l,r] [l,r] x x x y y y 出现频次之差为 p r e x [ r + 1 ] − p r e x [ l ] − ( p r e y [ r + 1 ] − p r e y [ l ] ) pre_x[r+1]-pre_x[l]-(pre_y[r+1]-pre_y[l]) prex[r+1]prex[l](prey[r+1]prey[l]),把式子中 r + 1 r+1 r+1 放到一边, l l l 放到一边,得到 p r e x [ r + 1 ] − p r e y [ r + 1 ] − ( p r e x [ l ] − p r e y [ l ] ) pre_x[r+1]-pre_y[r+1]-(pre_x[l]-pre_y[l]) prex[r+1]prey[r+1](prex[l]prey[l]) ,此时发现,本题可以使用滑动窗口中的枚举右,维护左来做:

  • 本题要求子字符串的长度至少为 k k k,且子字符串中 x , y x,y x,y 的出现次数大于 0 0 0,即 r − l + 1 ⩾ k r-l+1 \geqslant k rl+1k p r e x [ r + 1 ] > p r e y [ r + 1 ] pre_x[r+1]>pre_y[r+1] prex[r+1]>prey[r+1] p r e x [ l ] > p r e y [ l ] pre_x[l]>pre_y[l] prex[l]>prey[l]
  • 本题求最大差值,在右端点固定的情况下,要想使得 p r e x [ r + 1 ] − p r e y [ r + 1 ] − ( p r e x [ l ] − p r e y [ l ] ) pre_x[r+1]-pre_y[r+1]-(pre_x[l]-pre_y[l]) prex[r+1]prey[r+1](prex[l]prey[l]) 越大,就是要 p r e x [ l ] − p r e y [ l ] pre_x[l]-pre_y[l] prex[l]prey[l] 的值越小,所以需要维护 p r e x [ l ] − p r e y [ l ] pre_x[l]-pre_y[l] prex[l]prey[l] 的最小值。又因为本题要求子字符串中 x x x 的出现次数必须为奇数, y y y 的出现次数必须为偶数( > 0 >0 >0),这里可以使用数组 m e m o [ p ] [ q ] memo[p][q] memo[p][q] 来记录 x x x y y y 的出现次数是为 p p p q q q 时, p r e x [ l ] − p r e y [ l ] pre_x[l]-pre_y[l] prex[l]prey[l] 的最小值( p , q p,q p,q 只表示奇偶性)
  • 更新答案 a n s = m a x ( a n s , p r e x [ r + 1 ] − p r e y [ r + 1 ] − m e m o [ p ] [ q ] ) ans = max(ans,pre_x[r+1]-pre_y[r+1]-memo[p][q]) ans=max(ans,prex[r+1]prey[r+1]memo[p][q]),这里的 p p p 的奇偶性与 p r e x [ r + 1 ] pre_x[r+1] prex[r+1] 相反, q q q 的奇偶性与 p r e y [ r + 1 ] pre_y[r+1] prey[r+1] 相同。

代码如下:

class Solution {public int maxDifference(String s, int k) {final int inf = Integer.MAX_VALUE/2;int n = s.length();int ans = -inf;for(int x = 0; x < 5; x++){for(int y = 0; y < 5; y++){if(x == y) continue;int[] pre_x = new int[n+1];int[] pre_y = new int[n+1];int[][] memo = {{inf, inf}, {inf, inf}};for(int l = 0, r = 0; r < n; r++){int a = s.charAt(r) - '0';pre_x[r+1] = pre_x[r] + (a == x ? 1 : 0);pre_y[r+1] = pre_y[r] + (a == y ? 1 : 0);// r - l + 1 >= k// pre_x[r+1] > pre_x[l]// pre_y[r+1] > pre_y[l]while(r - l + 1 >= k && pre_x[r+1] > pre_x[l] && pre_y[r+1] > pre_y[l]){int p = pre_x[l] & 1;int q = pre_y[l] & 1; memo[p][q] = Math.min(memo[p][q], pre_x[l] - pre_y[l]);l++;}//子字符串长度大于等于 k,才能更新答案if(r + 1 >= k)ans = Math.max(ans, pre_x[r+1] - pre_y[r+1] - memo[pre_x[r+1] & 1 ^ 1][pre_y[r+1] & 1]);}}}return ans;}
}

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

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

相关文章

鸿蒙HarmonyOS NEXT开发:优化用户界面性能——组件复用(@Reusable装饰器)

文章目录 一、概述二、原理介绍三、使用规则四、复用类型详解1、标准型2、有限变化型2.1、类型1和类型2布局不同&#xff0c;业务逻辑不同2.2、类型1和类型2布局不同&#xff0c;但是很多业务逻辑公用 3、组合型4、全局型5、嵌套型 一、概述 组件复用是优化用户界面性能&#…

pyrender 渲染报错解决

pyrender渲染后&#xff0c;出来的图样子不对&#xff1a; 正确的图&#xff1a; 解决方法&#xff1a; pip install numpy1.26 下面的不是必须的&#xff1a; pip install pyrender0.1.45 os.environ["PYOPENGL_PLATFORM"] "egl" os.environ[EGL_DEVI…

CCFCSP第34次认证第一题——矩阵重塑(其一)

第34次认证第一题——矩阵重塑&#xff08;其一&#xff09; 官网链接 时间限制&#xff1a; 1.0 秒 空间限制&#xff1a; 512 MiB 相关文件&#xff1a; 题目目录&#xff08;样例文件&#xff09; 题目背景 矩阵&#xff08;二维&#xff09;的重塑&#xff08;reshap…

Neurlps2024论文解读|BERTs are Generative In-Context Learners-water-merged

论文标题 BERTs are Generative In-Context Learners BERTs 是生成式上下文学习器 论文链接 BERTs are Generative In-Context Learners论文下载 论文作者 David Samuel 内容简介 本文探讨了掩码语言模型&#xff08;如DeBERTa&#xff09;在上下文学习中的生成能力&…

深入理解Java对接DeepSeek

其实&#xff0c;整个对接过程很简单&#xff0c;就四步&#xff0c;获取key&#xff0c;找到接口文档&#xff0c;接口测试&#xff0c;代码对接。 1.获取 KEY https://platform.deepseek.com/transactions 直接付款就是了&#xff08;现在官网暂停充值2025年2月7日&#xf…

OSPF高级特性(3):安全特效

引言 OSPF的基础我们已经结束学习了&#xff0c;接下来我们继续学习OSPF的高级特性。为了方便大家阅读&#xff0c;我会将高级特性的几篇链接放在末尾&#xff0c;所有链接都是站内的&#xff0c;大家点击即可阅读&#xff1a; OSPF基础&#xff08;1&#xff09;&#xff1a;工…

HCIA项目实践--静态路由的总结和简单配置

七、静态路由 7.1 路由器获取未知网段的路由信息&#xff1a; &#xff08;1&#xff09;静态路由&#xff1a;网络管理员手工配置的路由条目&#xff0c;它不依赖网络拓扑的变化进行自动更新&#xff0c;而是根据管理员预先设定的路径来转发数据包。其优点是配置简单、占用系…

3dtiles——Cesium ion for Autodesk Revit Add-In插件

一、说明&#xff1a; Cesium已经支持3dtiles的模型格式转换&#xff1b; 可以从Cesium官方Aesset中上传gltf等格式文件转换为3dtiles&#xff1b; 也可以下载插件&#xff08;例如revit-cesium插件&#xff09;转换并自动上传到Cesium官方Aseet中。 Revit转3dtiles插件使用…

HCIA项目实践---网络层次常见的三种模型

2.2 网络的层次 2.2.1 常见的三种网络层次划分 应用层 &#xff08;1&#xff09;OSI 七层模型 物理层&#xff1a;处于最底层&#xff0c;主要负责处理物理介质上的信号传输&#xff0c;如电缆、光纤、无线等。其作用是定义物理设备的接口标准、信号的编码方式、传输速率等&…

【图片转换PDF】多个文件夹里图片逐个批量转换成多个pdf软件,子文件夹单独合并转换,子文件夹单独批量转换,基于Py的解决方案

建筑设计公司在项目执行过程中&#xff0c;会产生大量的设计图纸、效果图、实景照片等图片资料。这些资料按照项目名称、阶段、专业等维度存放在多个文件夹和子文件夹中。 操作需求&#xff1a;为了方便内部管理和向客户交付完整的设计方案&#xff0c;公司需要将每个项目文件…

Python:凯撒密码

题目内容&#xff1a; 凯撒密码是古罗马恺撒大帝用来对军事情报进行加密的算法&#xff0c;它采用了替换方法对信息中的每一个英文字符循环替换为字母表序列该字符后面第三个字符&#xff0c;对应关系如下&#xff1a; 原文&#xff1a;A B C D E F G H I J K L M N O P Q R …

亚信安全正式接入DeepSeek

亚信安全致力于“数据驱动、AI原生”战略&#xff0c;早在2024年5月&#xff0c;推出了“信立方”安全大模型、安全MaaS平台和一系列安全智能体&#xff0c;为网络安全运营、网络安全检测提供AI技术能力。自2024年12月DeepSeek-V3发布以来&#xff0c;亚信安全人工智能实验室利…

2024BaseCTF_week4_web上

继续&#xff01;冲冲冲 目录 圣钥之战1.0 nodejs 原型 原型链 原型链污染 回到题目 flag直接读取不就行了&#xff1f; 圣钥之战1.0 from flask import Flask,request import jsonapp Flask(__name__)def merge(src, dst):for k, v in src.items():if hasattr(dst, __geti…

【Java 面试 八股文】Redis篇

Redis 1. 什么是缓存穿透&#xff1f;怎么解决&#xff1f;2. 你能介绍一下布隆过滤器吗&#xff1f;3. 什么是缓存击穿&#xff1f;怎么解决&#xff1f;4. 什么是缓存雪崩&#xff1f;怎么解决&#xff1f;5. redis做为缓存&#xff0c;mysql的数据如何与redis进行同步呢&…

使用 Dockerfile 构建自定义 Nginx 镜像并集成 nginx_upstream_check_module

目录 1. 为什么需要自定义 Nginx 镜像&#xff1f; 2. Dockerfile 解析 2.1 基础镜像选择 2.2 安装依赖 2.3 下载并解压 Nginx 源码 2.4 应用补丁并编译 Nginx 2.5 暴露端口并设置启动命令 3. 构建并运行自定义 Nginx 镜像 3.1 构建镜像 3.2 运行容器 3.3 健康检测配…

Python办公自动化之PDF

python版本&#xff1a;3.13.1 开发工具&#xff1a;pycharm 安装三方库&#xff1a;pypdf2 、pdfplumber、pymupdf 一、从PDF中提取文字 用Python从PDF中提取文字-CSDN博客 二、从PDF中提取表格 用Python从PDF中提取表格-CSDN博客 三、拆分和合并PDF文件 用Python拆…

ds-download-link 插件:以独特图标选择,打造文章下载链接

源码介绍 “ds-download-link”插件为 WordPress 网站提供了在文章编辑器中添加下载链接的功能&#xff0c;每个下载链接都支持图标选择&#xff0c;并能将这些链接以美观的样式展示在文章前端页面。以下是该插件的主要特性和功能&#xff1a; 后台功能 在文章编辑器下方添加…

实操部署DeepSeek,添加私有知识库

目录 一、环境介绍 PowerShell版本&#xff1a; wsl版本&#xff1a; 虚拟机版本&#xff1a; 本机IP&#xff1a; 虚拟机IP&#xff1a; 容器宿主机IP&#xff08;host.docker.internal&#xff09;&#xff1a; Docker版本&#xff1a; Docker Compose版本&#xff…

一致性Hash算法延伸至Redis分片扩容使Lua脚本失效如何解决

文章部分内容来源&#xff1a;小林coding 问题场景&#xff1a;我们需要用Lua脚本&#xff0c;并且这个Lua脚本需要用到两个Key&#xff0c;但这两个Key必须命中同一台机器才可以&#xff0c;不然Lua脚本就会执行失败。如果集群扩容可能会导致两个Key落到不同的节点上导致Lua脚…

macMini16G内存M4芯片 DeepSeek-r1本地化部署+chatbox三步走

DeepSeek本地化部署&#xff0c;有利于保护隐私&#xff0c;调用也方便。 大体来说分为3步&#xff1a;安装ollama&#xff0c;获取deepseekR1模型&#xff0c;chatbox设置并调用。 1.下载ollama客户端&#xff0c;并安装。 https://ollama.com/download 2.获取deepseekR1模型…