Leetcode - 周赛425

目录

一,3364. 最小正和子数组

二, 3365. 重排子字符串以形成目标字符串

三,3366. 最小数组和

四,3367. 移除边之后的权重最大和


一,3364. 最小正和子数组

本题可以直接暴力枚举,代码如下:

class Solution {public int minimumSumSubarray(List<Integer> nums, int l, int r) {int n = nums.size();int ans = Integer.MAX_VALUE;for(int k=l; k<=r; k++){int s = 0;for(int i=0, j=0; j<n; j++){s += nums.get(j);if(j-i+1 > k){s -= nums.get(i);i++;}if(j-i+1 == k && s > 0) ans = Math.min(ans, s);}}return ans==Integer.MAX_VALUE ? -1 : ans;}
}

如果它的数据范围更大一点,上述做法会超时,所以这里再介绍一个O(n*logn)的做法:

  • 这题求子数组和的最小正值,子数组和可以直接使用前缀和来求
  • 题目要求子数组的长度在 [L,R] 之间,可以枚举左端点 / 右端点,这里选择枚举右端点下标 i,再根据上述条件直接推出左端点的下标 j 的范围 [i-R,i-L]
  • 假设前缀和数组为 s,此时 si 是固定的,要使得 si - sj 的值更大,sj 必须是小于 si 的最大值(题目要求为正数),求 sj < si 的最大值且 j 属于 [i-R,i-L],这可以使用有序集合+二分来做

代码如下:

class Solution {public int minimumSumSubarray(List<Integer> nums, int l, int r) {int n = nums.size();int ans = Integer.MAX_VALUE;int[] pre = new int[n+1];for(int i=0; i<n; i++){pre[i+1] = pre[i] + nums.get(i);}//枚举右端点:[i-r, i-l] ~ i//s[i-r, i-l] < si, 二分枚举最接近si的值 TreeMap<Integer, Integer> map = new TreeMap<>();for(int i=l, j=0; i<=n; i++){map.merge(pre[i-l], 1, Integer::sum);// 错误写法:// 当l==r时,会出错(没有计算当前子数组的大小)// if(i-r > 0){//     map.merge(pre[i-r], -1, Integer::sum);//     if(map.get(pre[i-r])==0) map.remove(pre[i-r]);// } Integer res = map.lowerKey(pre[i]);if(res != null)ans = Math.min(ans, pre[i]-res);if(i-r >= 0){map.merge(pre[i-r], -1, Integer::sum);if(map.get(pre[i-r])==0) map.remove(pre[i-r]);} }return ans == Integer.MAX_VALUE ? -1 : ans;}
}

二, 3365. 重排子字符串以形成目标字符串

本题直接暴力哈希,使用哈希表统计字符串 s 中分割成 k 个等长的子字符串,再看 t 中分割出的 k 个等长子字符串是否与字符串 s 完全相同。

代码如下:

class Solution {public boolean isPossibleToRearrange(String s, String t, int k) {Map<String, Integer> map = new HashMap<>();int n = s.length();for(int i=n/k; i<=n; i+=n/k){map.merge(s.substring(i-n/k, i), 1, Integer::sum);}for(int i=n/k; i<=n; i+=n/k){String x = t.substring(i-n/k, i);map.merge(x, -1, Integer::sum);if(map.get(x) == 0) map.remove(x);if(map.getOrDefault(x, 0) < 0) return false; }return map.size() == 0;}
}

三,3366. 最小数组和

本题数据范围较小,直接使用dp暴力求解,先找与原问题相同的子问题,从前往后遍历,对于第 i 个数来说:

  • 不执行任何操作,剩下变成求 [i+1,n] 这些数进行 x 次操作1,y 次操作2后的最小元素和
  • 执行操作1,剩下变成求 [i+1,n] 这些数进行 x-1 次操作1,y 次操作2后的最小元素和
  • 执行操作2,剩下变成求 [i+1,n] 这些数进行 x 次操作1,y-1 次操作2后的最小元素和
  • 执行操作1和操作2,剩下变成求 [i+1,n] 这些数进行 x-1 次操作1,y-1 次操作2后的最小元素和

定义 dfs(i,x,y):对 [i,n] 进行 x 次操作1,y 次操作2后的最小元素和,对于 nums[i] 进行分类讨论:

  • 不执行任何操作,剩下变成求 [i+1,n] 这些数进行 x 次操作1,y次操作2后的最小元素和,即dfs(i+1,x,y) + nums[i]
  • 执行操作1,剩下变成求 [i+1,n] 这些数进行 x-1 次操作1,y次操作2后的最小元素和,即dfs(i+1,x-1,y) + (nums[i]+1)/2
  • 执行操作2,剩下变成求 [i+1,n] 这些数进行 x 次操作1,y-1次操作2后的最小元素和,即dfs(i+1,x,y-1) + nums[i] - k
  • 执行操作1和操作2,剩下变成求 [i+1,n] 这些数进行 x-1 次操作1,y-1次操作2后的最小元素和,即 dfs(i+1,x-1,y-1) + (nums[i] - k + 1)/2,同时操作时先2后1更优,(nums[i]+1)/2 - k >= (nums[i]-k+1)/2

代码如下:

class Solution {public int minArraySum(int[] nums, int k, int op1, int op2) {int n = nums.length;memo = new int[n][op1+1][op2+1];for (int[][] mat : memo) {for (int[] row : mat) {Arrays.fill(row, -1); // -1 表示没有计算过}}return dfs(0, op1, op2, k, nums);}int[][][] memo;int dfs(int i, int x, int y, int k, int[] nums){if(i == nums.length) return 0;if(memo[i][x][y] != -1) return memo[i][x][y];int res = dfs(i+1, x, y, k, nums) + nums[i];if(x > 0)res = Math.min(res, dfs(i+1, x-1, y, k, nums) + (nums[i]+1)/2);if(y > 0 && nums[i] >= k){res = Math.min(res, dfs(i+1, x, y-1, k, nums) + nums[i] - k);if(x > 0){int t = (nums[i]+1)/2 >= k ? (nums[i]+1)/2 - k : (nums[i]-k+1)/2;res = Math.min(res, dfs(i+1, x-1, y-1, k, nums) + t);}}return memo[i][x][y] = res;}
}

递推代码:

class Solution {public int minArraySum(int[] nums, int k, int op1, int op2) {int n = nums.length;int[][][] f = new int[n+1][op1+1][op2+1];for(int i=n-1; i>=0; i--){for(int x=0; x<=op1; x++){for(int y=0; y<=op2; y++){f[i][x][y] = f[i+1][x][y] + nums[i];if(x > 0)f[i][x][y] = Math.min(f[i][x][y], f[i+1][x-1][y] + (nums[i]+1)/2);if(y > 0 && nums[i] >= k){f[i][x][y] = Math.min(f[i][x][y], f[i+1][x][y-1] + nums[i] - k);if(x > 0){int t = (nums[i]+1)/2 >= k ? (nums[i]+1)/2 - k : (nums[i]-k+1)/2;f[i][x][y] = Math.min(f[i][x][y], f[i+1][x-1][y-1] + t);}}}}}return f[0][op1][op2];}
}

四,3367. 移除边之后的权重最大和

代码如下:

class Solution {public long maximizeSumOfWeights(int[][] edges, int k) {int n = edges.length;List<int[]>[] g = new ArrayList[n+1];Arrays.setAll(g, e -> new ArrayList<>());for(int[] e : edges){int x = e[0], y = e[1], val = e[2];g[x].add(new int[]{y, val});g[y].add(new int[]{x, val});}long[] f = dfs(0, -1, k, g);return f[1];//{s, s+first} f[1] >= f[0]}long[] dfs(int x, int fa, int k, List<int[]>[] g){PriorityQueue<Long> que = new PriorityQueue<>();//默认最小堆long s = 0;for(int[] y : g[x]){if(y[0] == fa) continue;long[] f = dfs(y[0], x, k, g);//选/不选 x-y 这条边 f[0]+y[1]/f[1]//选/不选 怎么在至多 选K个边 的情况下,使其最大?//先把不选的值全部求和,在求出如果选相较于不选提升了多少,//对其进行排序,选择k个提升最大的if(que.size() == k && que.peek() < f[0] + y[1] - f[1]){que.poll();}if(que.size() < k && f[0] + y[1] - f[1] > 0){que.offer(f[0] + y[1] - f[1]);}s += f[1];}long first = que.size() == k ? que.poll() : 0;while(!que.isEmpty()){s += que.poll();}return new long[]{s, s+first};}
}

 

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

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

相关文章

微服务即时通讯系统的实现(服务端)----(2)

目录 1. 语音识别子服务的实现1.1 功能设计1.2 模块划分1.3 模块功能示意图1.4 接口的实现 2. 文件存储子服务的实现2.1 功能设计2.2 模块划分2.3 模块功能示意图2.4 接口的实现 3. 用户管理子服务的实现3.1 功能设计3.2 模块划分3.3 功能模块示意图3.4 数据管理3.4.1 关系数据…

Matlab Simulink HDL Coder开发流程(一)— 创建HDL兼容的Simulink模型

创建HDL兼容的Simulink模型 一、使用Balnk DUT模板二、从HDL Coder库中选择模块三、为DUT开发算法/功能四、为设计创建Testbench五、仿真验证设计功能六、Simulink模型生成HDL代码 这个例子说明了如何创建一个用于生成HDL代码的Simulink模型。要创建兼容HDL代码生成的MATLAB算法…

mfc110u.dll是什么意思,mfc110u.dll丢失解决方法大全详解

mfc110u.dll是Microsoft Foundation Classes (MFC)库的一个特定版本&#xff08;版本11.0&#xff09;的Unicode动态链接库文件。MFC是Microsoft为C开发者设计的一个应用程序框架&#xff0c;主要用于简化Windows应用程序的开发工作。这个框架封装了很多Windows API函数&#x…

debian 11 虚拟机环境搭建过坑记录

目录 安装过程系统配置修改 sudoers 文件网络配置换源安装桌面mount nfs 挂载安装复制功能tab 无法补全其他安装 软件配置eclipse 配置git 配置老虚拟机硬盘挂载 参考 原来去 debian 官网下载了一个最新的 debian 12&#xff0c;安装后出现包依赖问题&#xff0c;搞了半天&…

JAVAWeb之CSS学习

前引 CSS&#xff0c;层叠样式表&#xff08;Cascading Style Sheets&#xff09;&#xff0c;能够对网页中元素位置的排版进行像素级精确控制&#xff0c;支持几乎所有的字体字号样式&#xff0c;拥有网页对象和模型样式编辑的能力&#xff0c;简单来说&#xff0c;美化页面。…

macos下brew安装redis

首先确保已安装brew&#xff0c;接下来搜索资源&#xff0c;在终端输入如下命令&#xff1a; brew search redis 演示如下&#xff1a; 如上看到有redis资源&#xff0c;下面进行安装&#xff0c;执行下面的命令&#xff1a; brew install redis 演示效果如下&#xff1a; …

element ui select绑定的值是对象的属性时,显示异常.

需要声明 value-key"value",如果还不行可能是数据类型不一致数字0和字符串0是不一致的. el-select v-model"value" clearable placeholder"Select" value-key"value" style"width: 240px"><!-- <el-option v-for&…

黑马程序员Java笔记整理(day06)

1.继承的特点 2.继承的权限 3. 4.小结 5.方法重写 6.子类构造器 7.兄弟构造器 8.多态 9.小结

VPC9527同步整流控制器,相对最大电压检测与强力自供电,与MP6908完全PIN TO PIN

VPC9527 是一款高性能的同步整流控制器,它兼容 CCM 和 DCM 两种模式,最大工作频率高达 700kHz;可 通过 SEL 引脚的逻辑电压来选择 400nS 或 800nS 两个关断检测的屏蔽时间;可通过 VLC 引脚来调整限压导通的 参数,以便与所选同步整流管的参数相匹配,获得适应的最优性能;它…

万字长文解读深度学习——多模态模型BLIP2

&#x1f33a;历史文章列表&#x1f33a; 深度学习——优化算法、激活函数、归一化、正则化 深度学习——权重初始化、评估指标、梯度消失和梯度爆炸 深度学习——前向传播与反向传播、神经网络&#xff08;前馈神经网络与反馈神经网络&#xff09;、常见算法概要汇总 万字长…

【Android】ARouter——强大的路由框架

引言 在我们使用组件化的时候&#xff0c;活动并不在一个模块当中&#xff0c;但是毕竟是一个程序我们需要在不同的模块之间进行跳转&#xff0c;我们会首先想到在需要进行通信的模块下都添加相应的依赖就可以解决这个问题&#xff0c;但这样无疑增加了各个组件之间的耦合性。…

Apache Doris 现行版本 Docker-Compose 运行教程

特别注意&#xff01;Doris On Docker 部署方式仅限于开发环境或者功能测试环境&#xff0c;不建议生产环境部署&#xff01; 如有生产环境或性能测试集群部署诉求&#xff0c;请使用裸机/虚机部署或K8S Operator部署方案&#xff01; 原文阅读&#xff1a;Apache Doris 现行版…

springboot363高校竞赛管理系统(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;高校竞赛管理系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解…

RAG数据拆分之PDF

引言RAG数据简介PDF解析方法及工具代码实现总结 二、正文内容 引言 本文将介绍如何将RAG数据拆分至PDF格式&#xff0c;并探讨PDF解析的方法和工具&#xff0c;最后提供代码示例。 RAG数据简介 RAG&#xff08;关系型属性图&#xff09;是一种用于表示实体及其关系的图数据…

labelimg每次标注的时候自动导入预设标签

背景说明 最近在做一个视频行为识别项目的时候&#xff0c;已经采集了视频样例片段&#xff0c;需要对视频的行为动作进行图片标注&#xff0c;自己很快完成了视频到图片的分割&#xff0c;在进行图片标注的时候&#xff0c;选用的标注工具是labelimg,由于视频转成图片后数量很…

Java对接AI大模型

随着AI大模型技术的升起,人们越来越感觉到生活上的便捷以及人机对话照进现实.什么是大模型呢? 大模型&#xff08;Large Model&#xff09;&#xff0c;通常是指参数量非常庞大的深度学习模型&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;、计算机视觉&#…

Java开发网络安全常见问题

1、敏感信息明文传输 用户敏感信息如手机号、银行卡号、验证码等涉及个人隐私的敏感信息不通过任何加密直接明文传输。 如下图中小红书APP 的手机短信验证码登录接口&#xff0c;此处没有对用户手机号和验证码等信息进行加密传输&#xff0c;可以很简单的截取并开展一些合法的…

【CSS in Depth 2 精译_063】10.2 深入理解 CSS 容器查询中的容器

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第十章 CSS 容器查询】 ✔️ 10.1 容器查询的一个简单示例 10.1.1 容器尺寸查询的用法 10.2 深入理解容器 ✔️ 10.2.1 容器的类型 ✔️10.2.2 容器的名称 ✔️10.2.3 容器与模块化 CSS ✔️ 10.3…

基于Springboot开发的时光兼职网

一、功能介绍 时光兼职网包含管理员、用户、商家三个角色以及前后台系统。 前台系统功能 首页、兼职信息推荐、查看更多等 职位申请、申请日期、上传简历、点击下载简历、留言反馈等 个人中心、上传图片、更新信息等 后台系统功能 用户登录&#xff1a; 个人中心、修改密码…

计算机的错误计算(一百七十一)

摘要 探讨 MATLAB 中秦九韶&#xff08;Horner&#xff09;多项式的错误计算。 例1. 用秦九韶&#xff08;Horner&#xff09;算法计算&#xff08;一百零七&#xff09;例1中多项式 直接贴图吧&#xff1a; 这样&#xff0c;MATLAB 给出的仍然是错误结果&#xff0c;因为准…