Leetcode - 周赛399

目录

一,3162. 优质数对的总数 I

二,3163. 压缩字符串 III

三,3164. 优质数对的总数 II

四, 3165. 不包含相邻元素的子序列的最大和


一,3162. 优质数对的总数 I

假设 x 是 nums1 数组中的值,y 是 nums2 数组中值,我们要求的就是有几个 (x,y) 满足

x % (y * k) == 0,可以直接暴力 

代码如下:

class Solution {public int numberOfPairs(int[] nums1, int[] nums2, int k) {int ans = 0;for(int x : nums1){for(int y : nums2){if(x%(y*k)==0) ans++;}}return ans;}
}

二,3163. 压缩字符串 III

本题是一道模拟题,遍历word字符串,将相邻且字符相同的子字符串,写成数字+字符的形式,比如 "aaabbc",写成 "3a2b1c",注意,数字最大是9,也就是说如果遇到比如12个连续的'a',我们要写成 "9a3a"。

代码如下: 

class Solution {public String compressedString(String word) {int cnt = 1;char[] ch = word.toCharArray();StringBuilder res = new StringBuilder();for(int i=1; i<ch.length; i++){if(ch[i] == ch[i-1] && cnt < 9){cnt++;}else{res.append(cnt);res.append(ch[i-1]);cnt = 1;}}if(cnt > 0){res.append(cnt);res.append(ch[ch.length-1]);} return res.toString();}
}

三,3164. 优质数对的总数 II

1. 预处理被除数:

  • 要求满足 x % (y * k) == 0 的数对(x,y),可以先枚举nums1数组,使用哈希表统计出 x / k 的所有因子及其对应的数量,再枚举 nums2 数组,看 y 是否是x/k的因子(即是否在哈希表中),如果存在,加上对应的值。最终得出答案

2.预处理除数

  • 除了上述做法,我们还可以先枚举nums1数组,使用哈希表统计出 x / k 及其对应的数量,枚举nums2数组,枚举 y 的倍数及其数量,看是否在哈希表中,如果存在,加上对应的值。最终得出答案

代码如下:

class Solution {//预处理被除数xpublic long numberOfPairs(int[] nums1, int[] nums2, int k) {Map<Integer, Integer> map = new HashMap<>();for(int x : nums1){//统计 <x/k 的因子, 对应的数量>if(x%k == 0){for(int i=1; i<=Math.sqrt(x/k); i++){if(x/k%i == 0){map.merge(i, 1, Integer::sum);if(i < x/k/i)map.merge(x/k/i, 1, Integer::sum);}}}}long ans = 0;for(int y : nums2){ans += map.getOrDefault(y, 0);}return ans;}
}class Solution {//预处理除数ypublic long numberOfPairs(int[] nums1, int[] nums2, int k) {//O(n+m+(mx/k)logm)Map<Integer, Integer> map1 = new HashMap<>();long mx = 0;for(int x : nums1){//统计 <x/k,x/k的数量>if(x%k == 0){map1.merge(x/k, 1, Integer::sum);mx = Math.max(mx, x/k);}}Map<Integer, Integer> map2 = new HashMap<>();for(int y : nums2){map2.merge(y, 1, Integer::sum);}long ans = 0;for(int y : map2.keySet()){ int s = 0;for(int j=y; j<=mx; j+=y){//枚举 y 的倍数s += map1.getOrDefault(j, 0);}ans += (long) s * map2.get(y);}return ans;}
}

四, 3165. 不包含相邻元素的子序列的最大和

本题一看就是一道标准的打家劫舍问题,直接上代码:

class Solution {public int maximumSumSubsequence(int[] nums, int[][] queries) {int MOD = (int)1e9 + 7;int n = nums.length;int[] f = new int[n];int ans = 0;for(int[] q : queries){nums[q[0]] = q[1];f[0] = Math.max(0, nums[0]);for(int i=1; i<n; i++){f[i] = Math.max(f[i-1], (i>1?f[i-2]:0)+nums[i]);}System.out.println(f[n-1]);ans = (ans+f[n-1])%MOD;}return ans;}
}

但是上述做法会超时,需要换一种做法,这题实际上需要使用线段树动态维护[0,n-1]的最大值,就是将 [l,r] = [l,mid] + [mid+1,r],不断的分治,但是由于题目要求不包含相邻元素,也就是说mid 和 mid+1这两个点最多只能取一个,而只靠一维数组无法维护,所以需要一个二维数组f[n][4],这里先用f00,f01,f10,f11表示一下它们的状态:

  • f00:表示[l,r]l,r都不选的合法最大值
  • f01:表示[l,r]l不选的合法最大值(r可选可不选)
  • f10:表示[l,r]r不选的合法最大值(l可选可不选)
  • f11:表示[l,r]都可以选的合法最大值(l,r可选可不选)

它们之间的递推关系:

  • f00 = max(f01+f00, f00+f10)
  • f01 = max(f00+f11, f01+f01)
  • f10 = max(f10+f10, f11+f00)
  • f11 = max(f10+f11, f11+f01)

画个图来理解一下:

剩下的基本都是线段树基本方法,没什么变化,代码如下:

class Solution {//f00:表示[l,r]l,r都不选的合法最大值//f01:表示[l,r]l不选的合法最大值(r可选可不选)//f10:表示[l,r]r不选的合法最大值(l可选可不选)//f11:表示[l,r]都可以选的合法最大值(l,r可选可不选)//[l, r] = [l, mid] + [mid+1, r]// 00 01 10 11//f00 = max(f01+f00, f00+f10)//f01 = max(f00+f11, f01+f01)//f10 = max(f10+f10, f11+f00)//f11 = max(f10+f11, f11+f01)int[][] f;int[] a;void maintain(int i){f[i][0] = Math.max(f[i<<1][1]+f[i<<1|1][0], f[i<<1][0]+f[i<<1|1][2]);f[i][1] = Math.max(f[i<<1][0]+f[i<<1|1][3], f[i<<1][1]+f[i<<1|1][1]);f[i][2] = Math.max(f[i<<1][2]+f[i<<1|1][2], f[i<<1][3]+f[i<<1|1][0]);f[i][3] = Math.max(f[i<<1][2]+f[i<<1|1][3], f[i<<1][3]+f[i<<1|1][1]);}void build(int l, int r, int i){if(l == r){f[i][3] = Math.max(0, a[l]);}else{int mid = (l + r) / 2;build(l, mid, i<<1);build(mid+1, r, i<<1|1);maintain(i);}}void update(int l, int r, int i, int R, int val){if(l == r){f[i][3] = Math.max(0, val);return;} int mid = (l + r) / 2;if(R <= mid){update(l, mid, i<<1, R, val);}else{update(mid+1, r, i<<1|1, R, val);}maintain(i);}int query(int l, int r, int i){return f[i][3];}public int maximumSumSubsequence(int[] nums, int[][] queries) {int MOD = (int)1e9 + 7;int n = nums.length;f = new int[n<<2][4];a = nums;build(0, n-1, 1);int ans = 0;for(int[] q : queries){update(0, n-1, 1, q[0], q[1]);ans = (ans + query(0, n-1, 1))%MOD;}return ans%MOD;}
}

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

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

相关文章

大模型微调常见方法

0&#xff0c; prefix tuning prefix-tuning 跟 soft prompt tuning 类似&#xff0c;只不过&#xff0c;soft prompt tuning 仅仅针对 transformer模型的输入进行&#xff0c;而prefixt-tuning 是针对 每一个 transformer block进行 soft prompt tuning 跟 hard prompt tunin…

PDF流前端如何接收:深度解析与实用策略

PDF流前端如何接收&#xff1a;深度解析与实用策略 在数字化时代&#xff0c;PDF作为一种常见的文件格式&#xff0c;广泛应用于各种场景。然而&#xff0c;如何在前端接收并处理PDF流&#xff0c;对于许多开发者来说仍是一个挑战。本文将从四个方面、五个方面、六个方面和七个…

c++ string模拟实现

模拟实现string类&#xff0c;里面包含四个成员变量&#xff0c;第一个是指向字符数组的指针&#xff0c;第二个变量是目前存放了多少个字符&#xff0c;第三个变量为这个字符数组的容量的大小。最后一个为静态成员变量npos。 注意&#xff1a;一个const 修饰的整型&#xff0…

项目更换服务器时间少8小时

时区错误 输入 date 查看当前的linux系统时间 hwclock --show 查看当前linux硬件时间 如果发现系统时间和硬件时间不同步&#xff0c;而且硬件时间是正确的&#xff0c;可以用以下命令&#xff1a;hwclock --hctosys 把硬件时间同步到系统时间 mysql时区错误可以参考这位大…

云服务器重启后无法访问phpMyAdmin的解决方案

一、背景 我在解决另一问题的时候&#xff0c;重启了云服务器。当我想再次访问phpMyAdmin时&#xff0c;出现了如下报错。 HTTPConnectionPool(host127.0.0.1, port888): Max retries exceeded with url: /phpmyadmin_609a02b02423214c/index.php?langzh_cn (Caused by Ne…

嵌入式知识学习分享~~

欢迎关注小徐的个人微信公众号&#xff0c;感觉微信的文章排版不错&#xff0c;后续会继续分享一些新的学习记录以及和大家共同进步~

如何利用unicloud阿里云云函数实现文件包括图片或文件上传,unicloud云函数写法一览

这里以一个单文件上传为例子&#xff0c;多图多文件同理&#xff0c;循环单图处理逻辑即可。 背景 前端vue上传图片文件&#xff08;base64格式&#xff09;到服务器&#xff0c;并获取返回的服务器资源存储路径 传入参数 { ”queryStringParameters“:{ "file":&qu…

Flutter 中的 CustomMultiChildLayout 小部件:全面指南

Flutter 中的 CustomMultiChildLayout 小部件&#xff1a;全面指南 Flutter 是一个由 Google 开发的开源移动 UI 框架&#xff0c;它允许开发者使用 Dart 语言来构建高性能、美观的移动应用。在 Flutter 的丰富组件库中&#xff0c;CustomMultiChildLayout 是一个强大的布局小…

基于广义极大极小凹惩罚的心电信号降噪方法(MATLAB R2021B)

凸优化是数学最优化的一个子领域&#xff0c;研究定义于凸集中的凸函数最小化问题。由于心电信号降噪的过程可以理解为求信号的稀疏近似解&#xff0c;因此基于凸优化和稀疏性表达的去噪方法可用于心电信号处理。在凸优化的数学模型中&#xff0c;惩罚项的选取对最终结果会产生…

如何在测试/线上环境页面访问本地接口?

文章目录 一、前言二、分析三、搭建1、搭建nginx&#xff0c;监听http请求转发2、监听https请求转发 四、总结 一、前言 在工作中&#xff0c;开发完的接口&#xff0c;一般测试的话&#xff0c;基本是使用Postman&#xff0c;如果要到页面测试&#xff0c;就要发版进行测试&a…

年中汇报季?——一文教会你如何进行数据分析

一、常见的数据分析报告类型 数据分析报告通常可以分为三类&#xff1a;日常分析报告、专题型分析报告和综合性分析报告。前两者是以数据结论建议的格式去撰写&#xff0c;综合性分析报告则是&#xff1a;行业环境调研&#xff08;竞品类产品数据分析&#xff09;自身产品数据…

面向对象编程的三大特性是什么?

面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是软件开发中一种重要的编程范式&#xff0c;它通过对象来组织代码和数据&#xff0c;使得代码更加模块化、可重用和易于维护。在面向对象编程中&#xff0c;有三大核心特性&#xff1a;封…

Java:使用Opencv进行大图找小图

本文将介绍使用Java操作Opencv进行行大图找小图测试&#xff01; 1、OpenCV简介 OpenCV是一个开源计算机视觉库&#xff0c;提供了丰富的图像处理和计算机规觉算法。它支持多种编程语言&#xff0c;包括Java本文将介绍如何在Java中使用OpenCV进行图像处理和计算机视觉任务。 …

自然语言处理(NLP)—— 信息提取与文档分类

1. 初识信息提取 1.1 信息提取的基本知识 1.1.1 信息提取的概念 信息提取&#xff08;IE, Information Extraction&#xff09;是自然语言处理&#xff08;NLP&#xff09;领域的一个重要分支&#xff0c;它专注于从文档或语料库中提取结构化信息。这与信息检索&#xff08;I…

TypeScript高级类型技巧:泛型、联合与交叉类型

泛型 在TypeScript中&#xff0c;泛型是一种强大的工具&#xff0c;它允许我们编写可重用的组件&#xff0c;这些组件可以适应多种类型。 1. 泛型约束&#xff08;Generic Constraints&#xff09; 泛型可以被约束在一个特定的类型或类型接口上&#xff0c;确保传递给泛型的…

RabbitMQ怎么保证可靠性

RabbitMQ怎么保证可靠性 前言生产端问题解决方案代码验证 RabbitMQ问题消费端问题解决方案代码验证 总结 前言 RabbitMQ相信大家都非常熟悉了&#xff0c;今天咱们来聊聊怎么保证RabbitMQ的可靠性。 那什么时候会出现问题呢&#xff1f; 第一种是生产端出现的问题。我们向队…

第五十天 进入子序列问题 | 300.最长递增子序列 674.最长连续递增序列 718.最长重复子数组

题目&#xff1a;300.最长递增子序列 1.dp数组的定义&#xff1a; 以nums[i]为结尾的最长递增子序列的长度 为什么一定表示 “以nums[i]结尾的最长递增子序” &#xff0c;因为我们在 做 递增比较的时候&#xff0c;如果比较 nums[j] 和 nums[i] 的大小&#xff0c;那么两个递…

MySQL-事务日志

事务的隔离性由 锁机制 实现 事务的原子性、一致性、隔离性 由事务的 redo日志 和 undo 日志来保证 redo log 称为 重做日志&#xff0c;提供再写入操作&#xff0c;恢复提交事务修改的页操作&#xff0c;用来保证事务的持久性。undo log 称为 回滚日志&#xff0c;回滚行记录…

selenium自动化介绍

文章目录 一、selenium原理 安装二、selenium使用1.创建浏览器对象&#xff0c;访问网址2.消除警告提示3.不显示浏览器中受控制字样4.防检测5.设置延时5.1强制延时5.2隐式延时 6.设置浏览器窗口大小 三、案例实战&#xff1a;百度搜索四、iframe标签五、案例实战&#xff1a;Q…

第一周 数据结构与算法以及复杂度分析

数据结构与算法 算法定义 算法&#xff08;algorithm&#xff09;是在有限时间内解决特定问题的一组指令或操作步骤&#xff0c;它具有以下特性。 1.问题是明确的&#xff0c;包含清晰的输入和输出定义。 2.具有可行性&#xff0c;能够在有限步骤、时间和内存空间下完成。 3.…