Leetcode - 周赛435

news2025/2/13 20:02:21

目录

  • 一、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;
        //预处理 lcms
        long[] 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.coloradmin.cn/o/2297533.html

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

相关文章

算法之 数论

文章目录 质数判断质数3115.质数的最大距离 质数筛选204.计数质数2761.和等于目标值的质数对 2521.数组乘积中的不同质因数数目 质数 质数的定义&#xff1a;除了本身和1&#xff0c;不能被其他小于它的数整除&#xff0c;最小的质数是 2 求解质数的几种方法 法1&#xff0c;根…

docker 导出导入

1第一步骤docker save docker save -o database-export-4.1.0.tar database-export-4.1.0.jar:latest 2检查镜像ls -l, 注意&#xff1a;文件可能没有其他文件导出权限&#xff1a;chmod 644 database-export-4.1.0.tar 3在新的服务器导入&#xff1a; docker load -i databa…

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

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

基于SSM的农产品供销小程序+LW示例参考

1.项目介绍 系统角色&#xff1a;管理员、农户功能模块&#xff1a;用户管理、农户管理、产品分类管理、农产品管理、咨询管理、订单管理、收藏管理、购物车、充值、下单等技术选型&#xff1a;SSM&#xff0c;Vue&#xff08;后端管理web&#xff09;&#xff0c;uniapp等测试…

Unity URP的2D光照简介

官网工程&#xff0c;包括2d光照&#xff0c;动画&#xff0c;动效介绍&#xff1a; https://unity.com/cn/blog/games/happy-harvest-demo-latest-2d-techniques https://docs.unity3d.com/6000.0/Documentation/Manual/urp/Lights-2D-intro.html 人物脸部光照细节和脚上的阴影…

Jenkins 部署 之 Mac 一

Jenkins 部署 之 Mac 一 一.Jenkins 部署依赖 JDK 环境 查看 Mac JDK 环境&#xff0c;如果没有安装&#xff0c;先安装 打开终端输入命令:java -version Mac安装配置 JDK 二. 检查 HomeBrew 安装 检查 HomeBrew 是否安装&#xff0c;终端输入命令:brew -v Mac安装HomeB…

钉钉位置偏移解决,钉钉虚拟定位打卡

虚拟定位打卡工具 一&#xff0c;介绍免费获取工具 一&#xff0c;介绍 提到上班打卡&#xff0c;职场人的内心戏估计能拍成一部连续剧。打卡&#xff0c;这俩字仿佛自带“紧箍咒”&#xff0c;让无数打工人又爱又恨。想象一下&#xff0c;你气喘吁吁地冲进办公室&#xff0c;…

使用DeepSeek和Kimi快速自动生成PPT

目录 步骤1&#xff1a;在DeepSeek中生成要制作的PPT主要大纲内容。 &#xff08;1&#xff09;在DeepSeek网页端生成 &#xff08;2&#xff09;在本地部署DeepSeek后&#xff0c;使用chatBox生成PPT内容 步骤2&#xff1a;将DeepSeek成的PPT内容复制到Kimi中 步骤3&…

Webpack包

黑马程序员视频地址&#xff1a; Node.js与Webpack-16.Webpack简介以及体验 前言&#xff1a; 本篇中部分标题后标有数字&#xff0c;代表学习顺序 &#xff0c;同时也可以作为使用顺序参考 webpack包 基础认识 初步使用 下载webpack包和webpack-cli包 注意点&#xff1a; 1…

鸿蒙HarmonyOS NEXT开发:横竖屏切换开发实践

文章目录 一、概述二、窗口旋转说明1、配置module.json5的orientation字段2、调用窗口的setPreferredOrientation方法 四、性能优化1、使用自定义组件冻结2、对图片使用autoResize3、排查一些耗时操作 四、常见场景示例1、视频类应用横竖屏开发2、游戏类应用横屏开发 五、其他常…

基于Spring Security 6的OAuth2 系列之十五 - 高级特性--客户端认证方式

之所以想写这一系列&#xff0c;是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器&#xff0c;但当时基于spring-boot 2.3.x&#xff0c;其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0&#xff0c;结果一看Spring Security也升级…

排序合集之快排详解(二)

摘要&#xff1a;快速排序是一种在实践中广泛使用的高效排序算法。它基于分治策略&#xff0c;平均时间复杂度为O(n log n)&#xff0c;使其成为处理大型数据集的理想选择。本文将深入探讨快速排序的各种实现方式、优化技巧以及非递归实现&#xff0c;并通过C语言代码示例进行详…

前缀树算法篇:前缀信息的巧妙获取

前缀树算法篇&#xff1a;前缀信息的巧妙获取 那么前缀树算法是一个非常常用的算法&#xff0c;那么在介绍我们前缀树具体的原理以及实现上&#xff0c;我们先来说一下我们前缀树所应用的一个场景&#xff0c;那么在一个字符串的数据集合当中&#xff0c;那么我们查询我们某个字…

大数据系列 | 白话讲解大数据技术生态中Hadoop、Hive、Spark的关系介绍

大数据属于数据管理系统的范畴&#xff0c;数据管理系统无非就两个问题&#xff1a;数据怎么存、数据怎么算    现在的信息爆炸时代&#xff0c;一台服务器数据存不下&#xff0c;可以找10台服务器存储&#xff0c;10台存储不下&#xff0c;可以再找100台服务器存储。但是这1…

华为云函数计算FunctionGraph部署ollma+deepseek

1 概述 ollama和deepseek如果需要多实例&#xff0c;一种方式是部署在kubernetes集群中&#xff0c;一种是使用云厂商的云函数服务。云函数服务是按量付费&#xff0c;并且底层支持GPU&#xff0c;不需要维护kubernetes集群。本文介绍使用华为云函数计算FunctionGraph来部署ol…

尚硅谷爬虫note001

一、模板设置 file——setting——editor——code style——file and code template——python script # _*_ coding : utf-8 _*_ # Time : ${DATE} ${TIME} # Author : 20250206-里奥 # File : ${NAME} # Project : ${PROJECT_NAME} 二、数据类型 2-1. 数字 整型int 浮点型f…

35~37.ppt

目录 35.张秘书-《会计行业中长期人才发展规划》 题目​ 解析 36.颐和园公园&#xff08;25张PPT) 题目​ 解析 37.颐和园公园&#xff08;22张PPT) 题目 解析 35.张秘书-《会计行业中长期人才发展规划》 题目 解析 插入自定义的幻灯片&#xff1a;新建幻灯片→重用…

FPGA简介|结构、组成和应用

Field Programmable Gate Arrays&#xff08;FPGA&#xff0c;现场可编程逻辑门阵列&#xff09;&#xff0c;是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物&#xff0c; 是作为专用集成电路&#xff08;ASIC&#xff09;领域中的一种半定制电路而出现的&#xff0c…

4. React 中的 CSS

用例中的干净的脚手架的创建可以参考另一篇文章&#xff1a;3.React 组件化开发React官方并没有给出在React中统一的样式风格&#xff1a; 由此&#xff0c;从普通的css&#xff0c;到css modules&#xff0c;再到css in js&#xff0c;有几十种不同的解决方案&#xff0c;上百…

django中间件,中间件给下面传值

1、新建middleware.py文件 # myapp/middleware.py import time from django.http import HttpRequest import json from django.http import JsonResponse import urllib.parse from django.core.cache import cache from comm.Db import Db class RequestTimeMiddleware:def …