Leetcode - 周赛402

news2024/11/24 21:08:59

目录

一,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.coloradmin.cn/o/1846200.html

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

相关文章

NGINX_十八 nginx 访问控制

十八 nginx 访问控制 1 nginx 访问控制模块 &#xff08;1&#xff09;基于IP的访问控制&#xff1a;http_access_module &#xff08;2&#xff09;基于用户的信任登录&#xff1a;http_auth_basic_module 2 基于IP的访问控制 2.1 配置语法 Syntax&#xff1a;allow addr…

实现一个动态规划算法,解决背包问题

public class Test_31 {// 动态规划解决0-1背包问题public int knapsack(int capacity, int[] weights, int[] values, int n) {// 创建一个二维数组dp&#xff0c;用于记录状态转移过程int[][] dp new int[n 1][capacity 1];// 遍历物品for (int i 1; i < n; i) {// 遍…

73. UE5 RPG 优化投射物以及敌人生成

解决发射物会与地面产生交互的问题 之前一直遇到发射物的体积过大会在发射时&#xff0c;和地面产生交互&#xff0c;我们可以调整小一些&#xff0c;然后为了防止它和自身产生交互事件。我们可以实现它在生成后&#xff0c;不会触发相关事件&#xff0c;而是在一定时间后。 对…

编码RNA Terc-53和透明质酸受体Hmmr可调节小鼠的衰老

近期&#xff0c;厦门大学王耿教授团队在Protein & Cell&#xff08;IF21.1&#xff09;上发表题为“Noncoding RNA Terc-53 and hyaluronan receptor Hmmr regulate ageing in mice.”的研究。研究团队构建了一系列Terc-53小鼠模型&#xff0c;发现Terc-53小鼠表现出与年龄…

如何开发一个项目脚手架cli

目录 背景正文unbuildpromptsprogresskolorist 设置打包命令npm execnpxnpm init/ npm create/ npm innit 使用最后 背景 随着团队项目类型越来越多&#xff0c;方便后续快速去开发项目&#xff0c;会出现各种类型的项目模版项目。 这样开发只需要通过脚手架选择自己需要的项目…

钒能新材料综合回收利用,钒溶液净化富集工艺之离子交换法

钒电池储能产业作为典型的绿色低碳优势产业&#xff0c;是新型储能领域重要发展方向。钒电池储能具备大规模、长周期等优势&#xff0c;是储能领域的重要组成部分&#xff0c;将成为拓展电能利用、应对可再生能源随机波动、支撑可再生能源高占比电力系统的最佳技术途径之一。 …

java连接mysql报错

1.背景&#xff0c;直接升级操作系统从centos-》国产化操作系统&#xff0c;mysql也升级到5.7.44 2&#xff0c;报错 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconn…

【JavaEE进阶】Spring统一功能处理:拦截器的使用

目录 1.什么是拦截器? 2.拦截器的使用 2.1定义拦截器 2.2 注册配置拦截器 3.拦截器详解 3.1 拦截路径 3.2 拦截器的执行流程 4. 使用拦截器实现登录校验 4.1 定义拦截器 4.2 注册配置拦截器 1.什么是拦截器? 拦截器是Spring框架提供的核心功能之⼀, 主要用来拦截用…

数据采集之二主一从,485总线共享器

产品概述 485总线共享器示意图 功能示意图 DAQ-GP-485HUB是上海数采物联网推出的一款 RS485总线多路复用共享数据处理器&#xff0c;是一款高性能的通讯设备&#xff0c;专门针对两台主机和 一台从机通讯时导致的数据冲突而设计。在实际工业控制和监控场景中&#xff0c;多个主…

vlan技术--交换机实现局域网分割(Access模式trunk模式)

自作笔记... 目录 vlan技术--交换机连接pc实现局域网分割(Access模式) PC SW1 结果 vlan技术--交换机连接pc实现局域网分割(trunk模式) vlan技术--交换机连接pc实现局域网分割(Access模式) 交换机先创建vlan. 交换机分别进入接口 (配置好连接模式, 连接的vlan) PC SW1 …

华为设备telnet 远程访问配置实验简述

一、实验需求: 1、AR1模拟电脑telnet 访问AR2路由器。 二、实验步骤&#xff1a; 1、AR1和AR2接口配置IP&#xff0c;实现链路通信。 2、AR2配置AAA模式 配置用户及密码 配置用户访问级别 配置用户telnet 访问服务 AR2配置远程服务数量 配置用户远程访问模式为AAA 配置允许登录…

Boom 3D软件安装包下载-Boom 3D官网最新版下载

众多使用者向我们证明了Boom3D软件31段均衡器和预设&#xff1a;均衡器允许您仅通过手指滑动来调制音频&#xff0c;并将其另存为自定义预设&#xff0c;预设已经精心设计为不同类型的歌曲&#xff0c;因此您能够简单地拨入音频以适应您的心情。相信大家都认同Boom 3D 是一款出…

【云原生】Kubernetes网络知识

Kubernetes网络管理 文章目录 Kubernetes网络管理一、案例概述二、案例前置知识点2.1、Kubernetes网络模型2.2、Docker网络基础2.3、Kubernetes网络通信2.3.1、Pod内容器与内容之间的通信2.3.2、Pod与Pod之间的通信 2.4、Flannel网络插件2.5、Calico网络插件2.5.1、Calico网络模…

秋招突击——6/17——复习{整理昨天的面试资料}——新作{删除链表倒数第n个节点}

文章目录 引言复习新作删除链表倒数第N个节点题目描述个人实现参考实现 总结 引言 主管面&#xff0c;面的很凄惨&#xff0c;不过无所谓了&#xff0c;我已经尽力了。上午都在整理的面经&#xff0c;没有复习算法&#xff0c;而且这两天要弄一下论文&#xff0c;二十号就要提…

JetBrains GoLand 2024 mac/win版:高效开发,Go无止境

JetBrains GoLand 2024是一款专为Go语言开发者设计的集成开发环境(IDE)&#xff0c;为开发者带来了更加高效、智能和便捷的编程体验。 GoLand 2024 mac/win版获取 在代码编辑方面&#xff0c;GoLand 2024提供了全行代码补全功能&#xff0c;通过利用先进的深度学习模型&#x…

CDGA|数据治理要点是数据稳定、规范、安全,就像盖楼盘一样

在数字化浪潮汹涌的时代&#xff0c;数据已经成为企业运营和社会发展的核心驱动力。如同高楼大厦需要稳固的地基和规范的施工流程&#xff0c;数据治理同样需要确保数据的稳定性、规范性和安全性&#xff0c;以构建坚实可靠的数据大厦。 数据治理的首要任务是确保数据的稳定性 …

【linux】Linux分析cpu问题

CPU使用率高怎么分析&#xff1a; 首先先看哪些线程占用资源高看每个线程在干啥&#xff08;类似windows系统的任务管理器&#xff09; 步骤&#xff1a; 定位应用进程 pid jps -l # 查看进程找到线程 tid top -Hp {pid}将 tid 转换成十六进制 printf "%x\n" {…

中国信通院专访镜舟科技:开源商业化走了多远?

据《2023 中国开源发展蓝皮书》显示&#xff0c;随着数字化转型的深入&#xff0c;开源生态在去年快速发展&#xff0c;开源商业化的模式也逐渐成型。镜舟科技作为开源商业化的先行者&#xff0c;也在技术创新和商业拓展中稳步增长。 日前&#xff0c;中国信息通信研究院&…

游戏测试工程师面试,常问的问题有哪些?

一般会在面试中了解以下方面&#xff1a; 1.游戏热情&#xff0c;理解程度 玩过哪些游戏&#xff0c;这些游戏玩过多长时间&#xff0c;玩到什么样的水平&#xff0c;在游戏里花过多少钱 你觉得游戏里&#xff0c;xxx的设计如何&#xff0c;评价一下 2.编程、测试相关 学过哪…

这才多久,ChatGPT-4o 又被碾压了?

大模型皇位易主&#xff1f; 昨天&#xff0c;OpenAI 的竞争对手 Anthropic 发布了其最强大的 AI 模型&#xff1a;Claude 3.5 Sonnet。 目前&#xff0c;Claude 3.5 Sonnet 已经在 Claude.ai 和 Claude iOS 应用程序上免费提供。 据 Anthropic 号称&#xff0c;Claude 3.5 Son…