Leetcode - 周赛402

目录

一,3185. 构成整天的下标对数目 II

二,3186. 施咒的最大总伤害

三,3187. 数组中的峰值


一,3185. 构成整天的下标对数目 II

这里的T1,T2是一个题,这里直接一起讲了, 当我们已知 x%24 的值时,另一个数 y%24 的值一定等于(24 - x%24)%24(正整数时成立),得到这个性质之后,我们可以使用一个数组统计 %24 出现的次数,一边遍历一边统计。

代码如下:

class Solution {public long countCompleteDayPairs(int[] hours) {long ans = 0;int[] cnt = new int[24];for(int x : hours){ans += cnt[(24-x%24)%24];cnt[x%24]++;}return ans;}
}

二,3186. 施咒的最大总伤害

dfs记忆化——选或不选

本题重复的伤害值可以重复选,为了得到最大值,如果已经选择了某个值,那么与它相同的值也一定要选,所以可以先去重,统计所有元素的出现次数。题目还要求与他相邻为2的值不能选,所以可以将去重得到的数组排序,这样如果从前往后考虑,就可以只考虑power[i] + 1,power[i] + 2的情况;反之,亦然。

定义dfs(i):[0,i]可以达到的伤害值之和的最大值,考虑最后一个数选或不选:

  • 不选 i ,下一个状态是 dfs(i-1)
  • 选 i,下一个状态是 dfs(j-1),前提是满足 a[j-1] < a[i] - 2(a是去重后的数组)
  • i < 0,返回 0

代码如下:

class Solution {public long maximumTotalDamage(int[] power) {//去重 + 统计每个数出现的次数Map<Integer, Integer> map = new HashMap<>();for(int x : power) map.merge(x, 1, Integer::sum);int n = map.size(), k = 0;int[] a = new int[n];for(int x : map.keySet()){a[k++] = x;}Arrays.sort(a);memo = new long[n];Arrays.fill(memo, -1);return dfs(n-1, a, map);}long[] memo;long dfs(int i, int[] a, Map<Integer, Integer> map){if(i < 0) return 0;if(memo[i] != -1) return memo[i];int x = a[i];int j = i;while(j > 0 && a[j-1] >= x - 2){j--;}return memo[i] = Math.max(dfs(i-1, a, map), dfs(j-1, a, map)+(long)a[i]*map.get(a[i]));}
}

递推

定义 f[i]:前 i 个数可以达到的伤害值之和的最大值,由上述dfs可以得到递推公式:

  • f[i] = Math.max(f[i-1],f[j-1]+a[i]*map.get(a[i]))

代码如下:

class Solution {public long maximumTotalDamage(int[] power) {//去重 + 统计每个数出现的次数Map<Integer, Integer> map = new HashMap<>();for(int x : power) map.merge(x, 1, Integer::sum);int n = map.size(), k = 0;int[] a = new int[n];for(int x : map.keySet()){a[k++] = x;}Arrays.sort(a);long[] f = new long[n+1];//这是记忆化 1:1 复刻//for(int i=0; i<n; i++){//    int j = i;//    while(j>0 && a[j-1] >= a[i] - 2){//        j--;//    }//    f[i+1] = Math.max(f[j]+(long)a[i]*map.get(a[i]), f[i]);//}//可以发现当 i 越大的时候,j也只会变的越来越大int j = 0;for(int i=0; i<n; i++){while(a[j] < a[i] - 2){j++;}f[i+1] = Math.max(f[j]+(long)a[i]*map.get(a[i]), f[i]);}return f[n];}
}

三,3187. 数组中的峰值

本题需要维护的是前 i 个数中有几个峰值,可以将原数组转换一下,如果nums[i]是峰值元素,我们就将其视为 1,否则视为 0。接下来求 [l,r]的峰值个数就可以使用前缀和来计算。

本题需要动态修改nums数组,所以可以使用树状数组/线段树来实现,这里使用树状数组。比如要修改nums[i]的值:

  • 先把区间 [max⁡(i−1,1),min⁡(i+1,n−2)] 中的峰值元素从树状数组中去掉

  • 修改nums[i] = val

  • 再把区间 [max⁡(i−1,1),min⁡(i+1,n−2)] 中的峰值元素加入到树状数组中

代码如下:

class Fenwick{int[] tree;public Fenwick(int n){tree = new int[n];}//初始化和更改操作public void add(int i, int val){while(i < tree.length){tree[i] += val;i += (i & -i);}}//求前缀和public int pre(int i){int res = 0;while(i > 0){res += tree[i];i -= (i & -i);}return res;}//查询[l,r]区间的sum值public int query(int l, int r){if(l > r) return 0;return pre(r) - pre(l-1);}
}class Solution {public List<Integer> countOfPeaks(int[] nums, int[][] queries) {List<Integer> ans = new ArrayList<>();int n = nums.length;Fenwick f = new Fenwick(n-1);//[1, n-2],必须从下标1开始for(int i=1; i<n-1; i++){update(i, f, nums, 1);}for(int[] q : queries){if(q[0] == 1){ans.add(f.query(q[1]+1, q[2]-1));}else{int j = q[1];for(int i=Math.max(1, j-1); i<=Math.min(j+1,n-2); i++){update(i, f, nums, -1);}nums[j] = q[2];for(int i=Math.max(1, j-1); i<=Math.min(j+1,n-2); i++){update(i, f, nums, 1);}}}return ans;}public void update(int i, Fenwick f, int[] nums, int val){if(nums[i] > nums[i-1] && nums[i] > nums[i+1]){f.add(i, val);}}
}

 再贴一个线段树的做法:

class Solution {int[] cnt, a;void build(int l, int r, int i) {if (l == r) {cnt[i] = 0;} else {int mid = (l + r) >> 1;build(l, mid, i << 1);build(mid + 1, r, i << 1 | 1);cnt[i] = cnt[i<<1] + cnt[i<<1|1] +((l<mid && mid<r && a[mid]>a[mid-1]&&a[mid]>a[mid+1])||(l<mid+1 && mid+1<r && a[mid+1]>a[mid]&&a[mid+1]>a[mid+2]) ? 1 : 0);}}int query(int jobl, int jobr, int l, int r, int i) {if(jobr - jobl < 2) return 0;if (jobl <= l && r <= jobr) {return cnt[i];}int mid = (l + r) >> 1;int ans = 0, c = 0, b = 0;if (jobl <= mid) {c = query(jobl, jobr, l, mid, i << 1);}if (jobr > mid) {b = query(jobl, jobr, mid + 1, r, i << 1 | 1);}return c+b+(Math.max(l,jobl)<mid && mid<Math.min(r,jobr) && a[mid]>a[mid-1]&&a[mid]>a[mid+1]||(Math.max(l,jobl)<mid+1 && mid+1<Math.min(r,jobr) && a[mid+1]>a[mid]&&a[mid+1]>a[mid+2]) ? 1 : 0);}void update(int l, int r, int i, int jobr){if(l == r){return;} int mid = (l + r) / 2;if(jobr <= mid){update(l, mid, i<<1, jobr);}else{update(mid+1, r, i<<1|1, jobr);}cnt[i] = cnt[i<<1]+cnt[i<<1|1]+((l<mid && mid<r && a[mid]>a[mid-1]&&a[mid]>a[mid+1])||(l<mid+1 && mid+1<r && a[mid+1]>a[mid]&&a[mid+1]>a[mid+2]) ? 1 : 0);}public List<Integer> countOfPeaks(int[] nums, int[][] queries) {List<Integer> ans = new ArrayList<>();int n = nums.length;a = nums;cnt = new int[n<<2];build(0, n-1, 1);for(int[] q : queries){if(q[0]==1){ans.add(query(q[1], q[2], 0, n-1, 1));}else{a[q[1]] = q[2];update(0, n-1, 1, q[1]);}}return ans;}
}

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

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

相关文章

MobileNetV3轻量化YOLOv8

1 轻量化模型 一般而言,模型轻量化有三个途径: 知识蒸馏:大模型引导小模型训练,让其逼近大模型效果 轻量化模块替换:利用一些轻量化模块进行替换,减少模型参数 剪枝:通过优化算法引导模型裁剪无用的参数 MobileNetV3论文如下,自行搜索 2 修改步骤 在nn/modules的文…

qt+halcon实战

注意建QT工程项目用的是MSVC&#xff0c;如果选成MinGW,则会报错 INCLUDEPATH $$PWD/include INCLUDEPATH $$PWD/include/halconcppLIBS $$PWD/lib/x64-win64/halconcpp.lib LIBS $$PWD/lib/x64-win64/halcon.lib#include "halconcpp/HalconCpp.h" #include &quo…

Kubernetes Ingress 简介

前言 Ingress 是 Kubernetes 中的一种资源对象&#xff0c;用于管理从集群外部到内部服务的 HTTP 和 HTTPS 路由。它提供了灵活的路由功能、SSL/TLS 终止、负载均衡和虚拟主机支持。Ingress 需要一个 Ingress 控制器来实际处理路由&#xff0c;并且可以通过配置不同的控制器来…

RedHat9 | Web服务配置与管理(Apache)

一、实验环境 1、Apache服务介绍 Apache服务&#xff0c;也称为Apache HTTP Server&#xff0c;是一个功能强大且广泛使用的Web服务器软件。 起源和背景 Apache起源于NCSA httpd服务器&#xff0c;经过多次修改和发展&#xff0c;逐渐成为世界上最流行的Web服务器软件之一。…

蔚来汽车AI算法工程师,如何理解注意力?

大家好啊&#xff0c;我是董董灿。 今天分享一个上海蔚来汽车的AI算法岗位面试经验总结帖&#xff0c;面试岗位为算法工程师。 这次面试提到的问题&#xff0c;除了与实习相关内容和反问之外&#xff0c;面试官总共问了8个问题&#xff0c;主要集中在深度学习基础概念的理解上…

共93本!全网最全Frontiers旗下期刊2022、2023版影响因子和分区对比完整版目录!

本周投稿推荐 SSCI • 1区&#xff0c;4.0-5.0&#xff08;无需返修&#xff0c;提交可录&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; CNKI • 7天录用-检索&#xff08;急录友好&#xff09; SCI&EI • 4区生物医学类&#xff0c;0.1-0.5&…

Gotchiverse Alchemica 代币现已在Base上线

​ 朋友们大家好&#xff0c; 继 GHST 成功登陆 Base 之后&#xff0c;我们很高兴地宣布&#xff0c;Gotchiverse的 "Gotchus Alchemica " token 也将登陆 Base&#xff01; 从今天起&#xff0c;你就可以通过我们由 Socket 协议提供的新链抽象技术&#xff0c;将 Al…

# 消息中间件 RocketMQ 高级功能和源码分析(十一)

消息中间件 RocketMQ 高级功能和源码分析&#xff08;十一&#xff09; 一、消息中间件 RocketMQ 源码分析&#xff1a; 拉取消息长轮询机制 1、消息拉取长轮询机制分析 RocketMQ 未真正实现消息推模式&#xff0c;而是消费者主动向消息服务器拉取消息&#xff0c;RocketMQ …

毕业季带给我的五个启示

每到毕业季&#xff0c;校园里总是充满了复杂的情绪。有人欢笑&#xff0c;有人落泪。同样的四年大学生活&#xff0c;为何结局如此不同&#xff1f;本文将从多个角度探讨如何实现综合改变&#xff0c;解释在交友、机会和心态上的关键因素&#xff0c;揭示“慢就是快”的真理。…

go语言day2

使用cmd 中的 go install &#xff1b; go build 命令出现 go cannot find main module 错误怎么解决&#xff1f; go学习-问题记录(开发环境)go: cannot find main module&#xff1b; see ‘go help modules‘_go: no flags specified (see go help mod edit)-CSDN博客 在本…

MinIO 网络与覆盖网络

云计算和容器化技术的发展改变了应用程序的开发、部署和管理方式。这种转变给网络环境带来了重大变化&#xff0c;为DevOps和SRE工程师带来了新的挑战和机遇。然而&#xff0c;在这种转变中&#xff0c;出现了明显的知识差距&#xff0c;特别是在理解物理网络和硬件背景下网络的…

【自动驾驶】ROS小车系统

文章目录 小车组成轮式运动底盘的组成轮式运动底盘的分类轮式机器人的控制方式感知传感器ROS决策主控ROS介绍ROS的坐标系ROS的单位机器人电气连接变压模块运动底盘的电气连接ROS主控与传感器的电气连接ROS主控和STM32控制器两种控制器的功能运动底盘基本组成电池电机控制器与驱…

Vulnhub--OS-HACKNOS-2.1

渗透复现 目标站点为wordpress&#xff0c;通过wpscan进行漏洞扫描发现漏洞插件 通过漏洞插件存在的目录穿越漏洞成功读取/etc/passwd文件中flag用户的密码 SSH登录flag用户后在备份文件中找到rohit用户的密码 切换rohit用户&#xff0c;rohit用户能够以root权限执行任何文…

mysql自动填写当前时间,添加索引

mysql自动填写当前时间 在navicat操作界面创建表时&#xff0c;如果需要自动填写时间&#xff0c;可以操作如下 CURRENT_TIMESTAMP为表添加索引 ALTER table tableName ADD INDEX indexName(columnName)追加外键 ALTER TABLE tb_commentPhoto ADD CONSTRAINT FK_comment_ph…

Linux-目录和文件

目录 一、Linux目录 1、Linux常见目录 2、常见的Linux文件类型 二、cat-查看文件命令 1、cat命令用法 三、分页查看文件内容 1、 more命令 ​2、less命令 ​3、more和less的区别 四、查看文件开头或末尾 1、head命令 2、tail命令 3、wc-统计文件内容 4、grep 命令…

多功能投票系统(ThinkPHP+FastAdmin+Uniapp)

让决策更高效&#xff0c;更民主&#x1f31f; ​基于ThinkPHPFastAdminUniapp开发的多功能系统&#xff0c;支持图文投票、自定义选手报名内容、自定义主题色、礼物功能(高级授权)、弹幕功能(高级授权)、会员发布、支持数据库私有化部署&#xff0c;Uniapp提供全部无加密源码…

工业web4.0UI风格令人惊艳

工业web4.0UI风格令人惊艳

ARM阻击高通:AI PC大战与芯片之争

引言 在AI PC领域&#xff0c;高通的X Elite芯片因为其高性能和低功耗&#xff0c;一度被认为是未来的主导者。然而&#xff0c;ARM公司却通过法律手段试图阻止高通的独大&#xff0c;这不仅可能拖慢AI PC的发展进程&#xff0c;还引发了业界的广泛关注。本文将深入探讨ARM和高…

今日头条屏幕适配深度剖析

基本概念 首先几个基本概念解释&#xff1a; ● dpi&#xff1a;该值代表的是一英寸上有多少个像素点&#xff0c;常见取值为120&#xff0c;160&#xff0c;240。一般这个值才叫做密度 在android里面获取的方法为 metrics.densityDpi; 屏幕尺寸/分辨率得出DPI&#xff0c;一个…

MySQL进阶——视图

目录 1基本语法 1.1创建 1.2 查询 1.3 修改 1.4 删除 2 检查选项 2.1 级联CASCADED 2.2本地LOCAL 3 更新及作用 3.1视图的更新条件 3.2视图的作用 4视图案例 1基本语法 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&…