【力扣周赛】第 364 场周赛⭐(前后缀分解+单调栈DFS技巧)

文章目录

  • 竞赛链接
  • Q1:2864. 最大二进制奇数(贪心)
    • 写法1——手动模拟(代码长,运行快)
    • 写法2——API(代码短,运行慢)
  • Q2:2865. 美丽塔 I
    • 竞赛时代码——枚举山顶
  • Q3:2866. 美丽塔 II⭐(前后缀分解+单调栈)
    • 学习到的技巧
    • 相关题目列表📕
  • Q4:2867. 统计树中的合法路径数目(⭐)
    • 解法——枚举质数为根+DFS非质数连通块
      • 学习到的技巧
    • 相似题目——2242. 节点序列的最大得分
      • 解法——枚举中间的边
  • 成绩记录

竞赛链接

https://leetcode.cn/contest/weekly-contest-364/

Q1:2864. 最大二进制奇数(贪心)

https://leetcode.cn/problems/maximum-odd-binary-number/description/

贪心:最后一位保留一个 1,其余的 1 都放置在最开始的位置。

写法1——手动模拟(代码长,运行快)

class Solution {public String maximumOddBinaryNumber(String s) {int n = s.length(), cnt = 0;char[] chs = s.toCharArray();for (int i = 0; i < n; ++i) {if (chs[i] == '1') ++cnt;}for (int i = 0; i < n; ++i) {if (i < cnt - 1) chs[i] = '1';else chs[i] = '0';}chs[n - 1] = '1';return new String(chs);}
}

写法2——API(代码短,运行慢)

public class Solution {public String maximumOddBinaryNumber(String s) {int cnt1 = (int) s.chars().filter(c -> c == '1').count();return "1".repeat(cnt1 - 1) + "0".repeat(s.length() - cnt1) + "1";}
}

Q2:2865. 美丽塔 I

https://leetcode.cn/problems/beautiful-towers-i/description/

竞赛时代码——枚举山顶

计算每一个位置作为最高点时的最大结果,对所有结果取最大。

class Solution {public long maximumSumOfHeights(List<Integer> maxHeights) {long ans = 0;int n = maxHeights.size();for (int i = 0; i < n; ++i) {ans = Math.max(ans, op(i, maxHeights));}return ans;}public long op(int k, List<Integer> maxHeights) {long ans = maxHeights.get(k);long l = maxHeights.get(k), r = maxHeights.get(k);for (int i = k - 1; i >= 0; --i) {l = Math.min(maxHeights.get(i), l);ans += l;}for (int i = k + 1; i < maxHeights.size(); ++i) {r = Math.min(maxHeights.get(i), r);ans += r;}       if (l <= 0 || r <= 0) return 0;return ans;}
}

Q3:2866. 美丽塔 II⭐(前后缀分解+单调栈)

https://leetcode.cn/problems/beautiful-towers-ii/description/

在这里插入图片描述

class Solution {public long maximumSumOfHeights(List<Integer> maxHeights) {int[] a = maxHeights.stream().mapToInt(i -> i).toArray();   // 列表转数组int n = a.length;long[] suf = new long[n + 1];Deque<Integer> stk = new ArrayDeque<>();    // 单调递增的单调栈stk.push(n);                                // 加入 n 作为哨兵long sum = 0;// 从后往前for (int i = n - 1; i >= 0; --i) {int x = a[i];while (stk.size() > 1 && x <= a[stk.peek()]) {int j = stk.pop();sum -= (long) a[j] * (stk.peek() - j);  // 删除之前加到sum中的}sum += (long) x * (stk.peek() - i);         // 从i到stk.peek()-1都是xsuf[i] = sum;stk.push(i);}long ans = sum;stk.clear();stk.push(-1);// 从前往后long pre = 0;for (int i = 0; i < n; ++i) {int x = a[i];while (stk.size() > 1 && x <= a[stk.peek()]) {int j = stk.pop();pre -= (long) a[j] * (j - stk.peek());}pre += (long) x * (i - stk.peek());ans = Math.max(ans, pre + suf[i + 1]);stk.push(i);}return ans;}
}

学习到的技巧

  1. 撤销累加
  2. 加入哨兵

相关题目列表📕

【算法】前后缀分解题单
【算法】单调栈题单(矩阵系列、字典序最小、贡献法)

Q4:2867. 统计树中的合法路径数目(⭐)

https://leetcode.cn/problems/count-valid-paths-in-a-tree/description/

解法——枚举质数为根+DFS非质数连通块

class Solution {final static int MX = (int)1e5;final static boolean[] np = new boolean[MX + 1];    // 质数false,非质数truestatic {np[1] = true;for (int i = 2; i <= MX / i; ++i) {if (!np[i]) {for (int j = i * i; j <= MX; j += i) {np[j] = true;}}}}public long countPaths(int n, int[][] edges) {// 建树List<Integer>[] g = new ArrayList[n + 1];Arrays.setAll(g, e -> new ArrayList<>());for (int[] e: edges) {int x = e[0], y = e[1];g[x].add(y);g[y].add(x);}long ans = 0;int[] size = new int[n + 1];List<Integer> nodes = new ArrayList<>();    // 记录一个连通块中的所有节点for (int x = 1; x <= n; ++x) {if (np[x]) continue;        // 如果不是质数,就跳过。int sum = 0;for (int y: g[x]) {         // 质数x将这棵树分成了若干个连通块if (!np[y]) continue;if (size[y] == 0) {     // y还没有被计算过nodes.clear();dfs(y, -1, g, nodes);for (int z: nodes) size[z] = nodes.size();}ans += (long)size[y] * sum; // 与之前的连通块做乘法原理sum += size[y];}ans += sum;                 // 从x出发的路径}return ans;}// dfs过程是将这个连通块中的节点都放入nodes列表中void dfs(int x, int fa, List<Integer>[] g, List<Integer> nodes) {nodes.add(x);for (int y: g[x]) {if (y != fa && np[y]) {dfs(y, x, g, nodes);}}}
}

学习到的技巧

  1. dfs的过程将所有经过的节点放入一个列表中,这样就可以记录连通块的大小。
  2. 为了防止重复计算某个节点,创建一个数组存储其是否被经历过即可,这里可以直接存储它所在连通块的大小。

相似题目——2242. 节点序列的最大得分

https://leetcode.cn/problems/maximum-score-of-a-node-sequence/description/

周赛题目本质上是求一种类似于「非质数-质数-非质数」的路径个数。
这两题的共同点在于「枚举中间」,请读者细细品味。

在这里插入图片描述
在这里插入图片描述

解法——枚举中间的边

建树的过程中,对于每个节点只保留与它相连的最大的那三条边即可。
建树之后,枚举每条边作为中间边的情况,更新最大值。

class Solution {public int maximumScore(int[] scores, int[][] edges) {int n = scores.length;List<int[]>[] g = new ArrayList[n];Arrays.setAll(g, e -> new ArrayList());for (int[] edge: edges) {int x = edge[0], y = edge[1];g[x].add(new int[]{scores[y], y});g[y].add(new int[]{scores[x], x});}for (int i = 0; i < n; ++i) {// 如果和i相连的点的数量>3,就可以删掉只剩3个最大的// 这样删可以确保和它组成一个序列的另外3个值都不会被删掉// 即对于序列a-x-y-b,枚举到x的时候要保证a,y,b都不会被删掉// 删去其它的边是为了后面遍历的时候快一些if (g[i].size() > 3) {g[i].sort((a, b) -> (b[0] - a[0]));     // 按照score从大到小排序g[i] = new ArrayList<>(g[i].subList(0, 3));}}int ans = -1;// 枚举每个边作为中间的边for (int[] edge: edges) {int x = edge[0], y = edge[1];for (int[] p: g[x]) {int a = p[1];       // x旁边的节点号afor (int[] q: g[y]) {int b = q[1];   // y旁边的节点号bif (a != y && b != x && a != b) {ans = Math.max(ans, p[0] + q[0] + scores[x] + scores[y]);}}}}return ans;}   
}

成绩记录

在这里插入图片描述

很差劲,脑子是糊掉的。

在这里插入图片描述

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

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

相关文章

WPF 实现点击按钮跳转页面功能

方法1. 配置环境 首先添加prism依赖项&#xff0c;配置好所有文件。需要配置的有两个文件&#xff1a;App.xaml.cs和App.xaml App.xaml.cs using System.Data; using System.Linq; using System.Threading.Tasks; using System.Windows;namespace PrismDemo {/// <summa…

正点原子嵌入式linux驱动开发——STM32MP1启动详解

STM32单片机是直接将程序下载到内部 Flash中&#xff0c;上电以后直接运行内部 Flash中的程序。 STM32MP157内部没有供用户使用的 Flash&#xff0c;系统都是存放在外部 Flash里面的&#xff0c;比如 EMMC、NAND等&#xff0c;因此 STM32MP157上电以后需要从外部 Flash加载程序…

Linux高性能服务器编程 学习笔记 第九章 IO复用

IO复用使程序能同时监听多个文件描述符&#xff0c;这可以提高程序的性能&#xff0c;通常网络程序在以下情况需要使用IO复用&#xff1a; 1.客户端进程需要同时处理多个socket。 2.客户端进程需要同时处理用户输入和网络连接。 3.TCP服务器要同时处理监听socket和连接socket…

配置OSPF路由

OSPF路由 1.OSPF路由 1.1 OSPF简介 OSPF(Open Shortest Path First&#xff0c;开放式最短路径优先&#xff09;路由协议是另一个比较常用的路由协议之一&#xff0c;它通过路由器之间通告网络接口的状态&#xff0c;使用最短路径算法建立路由表。在生成路由表时&#xff0c;…

【通意千问】大模型GitHub开源工程学习笔记(2)--使用Qwen进行推理的示例代码解析,及transformers的库使用

使用Transformers来使用模型 如希望使用Qwen-chat进行推理,所需要写的只是如下所示的数行代码。请确保你使用的是最新代码,并指定正确的模型名称和路径,如Qwen/Qwen-7B-Chat和Qwen/Qwen-14B-Chat 这里给出了一段代码 from transformers import AutoModelForCausalLM, Aut…

机器学习笔记 - 基于强化学习的贪吃蛇玩游戏

一、关于深度强化学习 如果不了解深度强化学习的一般流程的可以考虑看一下下面的链接。因为这里的示例因为在PyTorch 之上实现深度强化学习算法。 机器学习笔记 - Deep Q-Learning算法概览深度Q学习是一种强化学习算法,它使用深度神经网络来逼近Q函数,用于确定在给定状态下采…

ROS2 中的轻量级、自动化、受控回放

一、说明 这篇文章描述了一种在 ROS2 中实现受控重播器的轻量级方法。用以测试中将现象重新播放一遍&#xff0c;以实现调参或故障定位的目的。所有源代码都可以在这里找到。该帖子也可在此处获得。 二、问题&#xff1a;不同步重播 任何曾经认真开发过 ROS2 的人都会知道这个问…

springboot和vue:八、vue快速入门

vue快速入门 新建一个html文件 导入 vue.js 的 script 脚本文件 <script src"https://unpkg.com/vuenext"></script>在页面中声明一个将要被 vue 所控制的 DOM 区域&#xff0c;既MVVM中的View <div id"app">{{ message }} </div…

uboot启动流程涉及reset汇编函数

一. uboot启动流程中函数 之前了解了uboot链接脚本文件 u-boot.lds。 从 u-boot.lds 中我们已经知道了入口点是 arch/arm/lib/vectors.S 文件中的 _start。 本文了解 一下&#xff0c;uboot启动过程中涉及的 reset 函数。本文继上一篇文章学习&#xff0c;地址如下&#xff…

统计模型----决策树

决策树 &#xff08;1&#xff09;决策树是一种基本分类与回归方法。它的关键在于如何构建这样一棵树。决策树的建立过程中&#xff0c;使用基尼系数来评估节点的纯度和划分的效果。基尼系数是用来度量一个数据集的不确定性的指标&#xff0c;其数值越小表示数据集的纯度越高。…

揭秘:机构招生电子传单制作的五个黄金法则

机构招生微传单制作一直都是让很多人在意的事情。一款好的微传单不仅可以吸引更多的学生&#xff0c;还可以省去很多招生工作的时间和精力。但是&#xff0c;很多人却不知道如何制作一款精美的微传单。下面就让我们来学习一下如何制作一款机构招生的微传单吧。 首先&#xff0c…

Egg 封装接口返回信息

中间件封装 代码 const msgArr {"200":成功,"401":token失效 } module.exports (option, app) > {return async function(ctx, next) {try{//成功是返回的信息ctx.emit(code,data,msg)>{console.log(1111,code,data,msg)ctx.body {code,data:dat…

springboot 简单配置mongodb多数据源

准备工作&#xff1a; 本地mongodb一个创建两个数据库 student 和 student-two 所需jar包&#xff1a; # springboot基于的版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>&l…

C++之std::atomic解决多线程7个问题(二百四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

竞赛选题 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉

文章目录 0 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习多目标跟踪 …

uniapp使用scroll-into-view实现锚点定位和滚动监听功能【楼层效果 / 侧边导航联动效果】

大佬网址&#xff1a; https://blog.csdn.net/weixin_47136265/article/details/132303570 效果 代码 <template><!-- 这里面有2个bug&#xff0c;已经解决&#xff0c;需要知道的地方1.methods里的scrollEvt(e)方法里面的 this.tabIndex index ! -1 ? index :…

MySQL - DML数据增删改

功能介绍&#xff1a; DML&#xff08;Data Manipulation Language&#xff09;数据操作语言&#xff0c;用来对数据库中表的数据记录进 行增、删、改操作。 添加数据&#xff08;INSERT&#xff09; 基本语法&#xff1a;insert into 表名(字段列表) values (值列表); …

el-collapse 嵌套中 el-checkbox作为标题,选中复选框与el-tree联动

<el-drawertitle"应用授权":visible.sync"menuDrawer"><el-collapse accordion style"padding: 15px"><el-collapse-item v-for"item in platList"><template slot"title"><el-checkbox v-model…

Mysql各种锁

一.不同存储引擎支持的锁机制 Mysql数据库有多种数据存储引擎&#xff0c;Mysql中不同的存储引擎支持不同的锁机制 MyISAM和MEMORY存储引擎采用的表级锁 InnoDB存储引擎支持行级锁&#xff0c;也支持表级锁&#xff0c;默认情况下采用行级锁 二.锁类型的划分 按照数据操作…

postgresql-管理数据表

postgresql-管理数据表 创建表数据类型字段约束表级约束模式搜索路径 修改表添加字段删除字段添加约束删除约束修改字段默认值修改字段数据类型重命名字段重命名表 删除表 创建表 在 PostgreSQL 中&#xff0c;使用 CREATE TABLE 语句创建一个新表&#xff1a; CREATE TABLE …