【力扣周赛】第 355 场周赛(构造二分答案异或前缀 状态压缩⭐)

文章目录

  • Q1:6921. 按分隔符拆分字符串(双指针)
  • Q2:6915. 合并后数组中的最大元素(倒序遍历+贪心)
    • 代码优化
  • Q3:6955. 长度递增组的最大数目🚹🚹🚹🚹🚹
    • 解法1——构造⭐
    • 解法2——排序 + 二分⭐(🐂!重要!有启发性!)
  • Q4:2791. 树中可以形成回文的路径数🚹🚹🚹🚹🚹(异或&哈希表)⭐⭐⭐⭐⭐
    • 补充:相关题目
      • 1457. 二叉树中的伪回文路径
      • 1371. 每个元音包含偶数次的最长子字符串
      • 1542. 找出最长的超赞子字符串
  • 成绩记录

Q1:6921. 按分隔符拆分字符串(双指针)

https://leetcode.cn/problems/split-strings-by-separator/description/

在这里插入图片描述
提示:

1 <= words.length <= 100
1 <= words[i].length <= 20
words[i] 中的字符要么是小写英文字母,要么就是字符串 ".,|$#@" 中的字符(不包括引号)
separator 是字符串 ".,|$#@" 中的某个字符(不包括引号)

用双指针手动切分每个 word 加入答案列表即可。

class Solution {public List<String> splitWordsBySeparator(List<String> words, char separator) {List<String> ans = new ArrayList();for (String word: words) {int n = word.length();for (int r = 0, l = 0; r < n; ++r) {if (word.charAt(r) == separator) {if (r > l) ans.add(word.substring(l, r));l = r + 1;} else if (r == n - 1) ans.add(word.substring(l, n));}}return ans;}
}

Q2:6915. 合并后数组中的最大元素(倒序遍历+贪心)

在这里插入图片描述
提示:

1 <= nums.length <= 10^5
1 <= nums[i] <= 10^6

贪心地尽量先合并后面的元素。

因为先合并前面的可能会导致数字变大不能继续合并。 e.g. 3,4,5 变成 7,5之后就不能合并了;但是变成3,9之后可以继续合并成12。

使用 long 是防止在原数组上计算时溢出。

class Solution {public long maxArrayValue(int[] nums) {long[] ans = new long[nums.length];for (int i = nums.length - 1; i >= 0; --i) {ans[i] = nums[i];}for (int i = nums.length - 1; i > 0; --i) {if (ans[i] >= ans[i - 1]) ans[i - 1] += ans[i];}return Arrays.stream(ans).max().getAsLong();}
}

代码优化

也可以用 cur 存储当前结果,省去额外的 long 数组。

class Solution {public long maxArrayValue(int[] nums) {long ans = nums[nums.length - 1], cur = ans;for (int i = nums.length - 1; i > 0; --i) {if (cur >= nums[i - 1]) cur += nums[i - 1];else cur = nums[i - 1];ans = Math.max(ans, cur);}return ans;}
}

Q3:6955. 长度递增组的最大数目🚹🚹🚹🚹🚹

https://leetcode.cn/problems/maximum-number-of-groups-with-increasing-length/description/

在这里插入图片描述

提示:

1 <= usageLimits.length <= 10^5
1 <= usageLimits[i] <= 10^9

解法1——构造⭐

在这里插入图片描述
证明讲解可见:https://www.bilibili.com/video/BV1n8411m7Fs/

class Solution {public int maxIncreasingGroups(List<Integer> usageLimits) {// 从小到大排序Collections.sort(usageLimits);long ans = 0, s = 0;for (int v: usageLimits) {s += v;// 如果像让当前的 ans + 1,就需要 s 足够组成 1 ~ ans + 1 的等差数列if (s >= (ans + 2) * (ans + 1) / 2) {// 每次来一个新的数字,且它的数量足够,那么就可以多构造出 1 组ans++;}}return (int)ans;}
}

解法2——排序 + 二分⭐(🐂!重要!有启发性!)

参考题解:https://leetcode.cn/problems/maximum-number-of-groups-with-increasing-length/solutions/2355580/pai-xu-er-fen-tu-jie-ban-by-yzq-a-smlx/

设可以组成 k 个序列。

二分答案。检查答案是否合理的过程是:将 usageLimits 从大到小进行排序,之后枚举。
数量少的元素可以补给数量大的元素,但是反过来不行。

在这里插入图片描述

在这里插入图片描述

class Solution {public int maxIncreasingGroups(List<Integer> usageLimits) {Collections.sort(usageLimits, (a, b) -> b - a);     // 降序排序int l = 0, r = usageLimits.size();while (l < r) {int mid = l + r + 1>> 1;if (check(usageLimits, mid)) l = mid;else r = mid - 1;}return l;}boolean check(List<Integer> usageLimits, int k) {int gap = 0;for (int v: usageLimits) {// 数量少的可以补给数量大的,所以降序排序后枚举gap = Math.min(gap + v - k, 0);if (k > 0) k--;         // k是当前需要的数量}return gap >= 0;}
}

Q:为什么要先使用数量多的元素?
A:因为数量多的元素即使数量大于组成序列个数 k,也最多只能使用 k 个,否则会重复。而数量小的元素可以放在任意不同的序列中而不会发生重复。

Q4:2791. 树中可以形成回文的路径数🚹🚹🚹🚹🚹(异或&哈希表)⭐⭐⭐⭐⭐

相似原题链接:https://loj.ac/p/6681

https://leetcode.cn/problems/count-paths-that-can-form-a-palindrome-in-a-tree/

在这里插入图片描述

提示:

n == parent.length == s.length
1 <= n <= 10^5
对于所有 i >= 1 ,0 <= parent[i] <= n - 1 均成立
parent[0] == -1
parent 表示一棵有效的树
s 仅由小写英文数字组成


注意题目要求的是路径可以重新排列成回文串而不是要求路径组成了回文串。(即对字母的顺序没有要求,只对字母的数量有要求)。

重要可以排列成回文串等价于最多一个字母出现奇数次,其余字母出现偶数次。

对于这道题来说,只有27个二进制数符合要求:
在这里插入图片描述

那么如何计算各个路径之间的异或和呢?
在这里插入图片描述

class Solution {List<Integer>[] g;String s;Map<Integer, Integer> cnt = new HashMap<>();long ans = 0;public long countPalindromePaths(List<Integer> parent, String s) {int n = parent.size();this.s = s;g = new ArrayList[n];Arrays.setAll(g, e -> new ArrayList<>());for (int i = 1; i < n; ++i) {g[parent.get(i)].add(i);}cnt.put(0, 1);          // 放入一条【空路径】dfs(0, 0);return ans;}void dfs(int x, int xor) {for (int y: g[x]) {int bit = 1 << (s.charAt(y) - 'a');int y_xor = xor ^ bit;ans += cnt.getOrDefault(y_xor, 0);      // 自己和自己异或是0for (int i = 0; i < 26; ++i) {// 和只有1位数字不一样的异或,结果上只有1位数字是1ans += cnt.getOrDefault(y_xor ^ (1 << i), 0);}cnt.merge(y_xor, 1, Integer::sum);dfs(y, y_xor);}}
}

注意在 dfs 之前要现在 cnt 中添加一条空路径。

我们在 dfs 过程中计算的是从根节点到各个节点的 xor。如果两条路径可以组成一条合理的路径有两种情况:1.两条路径的 xor 相同2.两条路径的二进制表示只有一个位置不同

补充:相关题目

1457. 二叉树中的伪回文路径

https://leetcode.cn/problems/pseudo-palindromic-paths-in-a-binary-tree/

在这里插入图片描述

提示:

给定二叉树的节点数目在范围 [1, 10^5] 内
1 <= Node.val <= 9

这道题目相对简单一些,只需要判断从根节点到叶子节点的路径能否排列成回文串。

class Solution {int ans = 0;public int pseudoPalindromicPaths (TreeNode root) {dfs(root, 0);return ans;}void dfs(TreeNode root, int xor) {xor ^= 1 << root.val;if (root.left == null && root.right == null) {if (xor == 0 || (xor & (xor - 1)) == 0) ++ans;return;}if (root.left != null) dfs(root.left, xor);if (root.right != null) dfs(root.right, xor);}
}

1371. 每个元音包含偶数次的最长子字符串

https://leetcode.cn/problems/find-the-longest-substring-containing-vowels-in-even-counts/

在这里插入图片描述

使用异或前缀,记录每一种状态出现的第一个位置,当出现了之前出现过的状态时,可以尝试更新答案。

class Solution {public int findTheLongestSubstring(String s) {int n = s.length(), ans = 0, xor = 0;String vowels = "aeiou";Map<Integer, Integer> idx = new HashMap<>();idx.put(0, -1);          // 0的位置是-1for (int i = 0; i < n; ++i) {char ch = s.charAt(i);// 如果是元音if (vowels.indexOf(ch) != -1) {xor ^= 1 << (ch - 'a');}// 记录每个状态第一次出现的位置if (idx.containsKey(xor)) {ans = Math.max(i - idx.get(xor), ans);} else idx.put(xor, i);}return ans;}
}

1542. 找出最长的超赞子字符串

https://leetcode.cn/problems/find-longest-awesome-substring/

在这里插入图片描述

提示:

1 <= s.length <= 10^5
s 仅由数字组成

可以变成回文子串:异或值至多有 1 个 1。

class Solution {public int longestAwesome(String s) {int n = s.length(), ans = 0, xor = 0;int[] idx = new int[1 << 10];Arrays.fill(idx, n);idx[0] = -1;for (int i = 0; i < n; ++i) {xor ^= 1 << (s.charAt(i) - '0');// 前缀一致,出现次数全是偶数if (idx[xor] != n) ans = Math.max(ans, i - idx[xor]);// 前缀只有一位不一样,只有一个次数是奇数for (int j = 0; j <= 9; ++j) {int x = xor ^ (1 << j);if (idx[x] != n) ans = Math.max(ans, i - idx[x]);}if (idx[xor] == n) idx[xor] = i;}return ans;}
}

成绩记录

在这里插入图片描述

在这里插入图片描述
T1做慢了。

T3、T4 做不出来是正常的(

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

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

相关文章

【JavaEE初阶】——第七节.Servlet入门学习笔记

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;JavaEE进阶 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录 前…

安全攻击 --- XSS攻击

XSS跨站脚本攻击 &#xff08;1&#xff09;简介 OWASP TOP 10 之一&#xff0c;XSS被称为跨站脚本攻击&#xff08;Cross-Site-Scripting&#xff09;主要基于JavaScript&#xff08;JS&#xff09;完成攻击行为XSS通过精心构造JS代码注入到网页中&#xff0c;并由浏览器解释…

【flutter】flutter如何让app内字体大小不随着系统改变而改变

如果我们不特意设置&#xff0c;flutter开发的app他的字体大小是会跟着系统设置的字体大小而改变&#xff0c;这样就会导致页面出现布局错乱问题&#xff0c;那么如何解决这个问题呢&#xff1f;我也搜索了相关资料&#xff0c;有两个常用也是网络上搜集到比较多的方法&#xf…

vs2013 32位 编译的 dll,重新用vs2022 64位编译,所遇问题记录

目录 一、vs2013 32 DLL 转 VS2022 64 DLL 所遇问题 1、 LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1800”不匹配值“1900” 2、原先VS2013 现在 VS2022 导致的vsnprintf 重定义问题 3、 无法解析的外部符号 __vsnwprintf_s 4、无法解析的外部符号__imp__CertFreeC…

Ros终端出现找不到bash: /home/***/devel/setup.bash: 没有那个文件或目录

现象&#xff1a;Ros终端出现找不到bash: /home/***/devel/setup.bash: 没有那个文件或目录 问题&#xff1a;配置时路径写错 解决方法&#xff1a;改正路径 1.打开文件 gedit ~/.bashrc2.修改正确路径

【ruby on rails】M1遇到的一些安装问题

1. homebrew位置变了 原来的Cellar Homebrew Caskroom 都是在 /usr/local/下面 M1在/opt/homebrew下面 2. 装ruby M1电脑安装ruby&#xff0c;装不上的问题 RUBY_CFLAGS"-w" rbenv install 2.7.43. 装puma报错 gem install puma -v 5.5.2 -- --with-openssl-dir…

Kubernetes.Service—使用源 IP

使用源 IP 运行在 Kubernetes 集群中的应用程序通过 Service 抽象发现彼此并相互通信&#xff0c;它们也用 Service 与外部世界通信。 本文解释了发送到不同类型 Service 的数据包的源 IP 会发生什么情况&#xff0c;以及如何根据需要切换此行为。 准备开始 术语表 本文使用…

kotlin 编写一个简单的天气预报app(三)

使用eventbus替换broadcast 将从Broadcast切换到EventBus有以下几个好处&#xff1a; 解耦性&#xff1a;通过使用EventBus&#xff0c;您可以实现组件之间的解耦。传统的Broadcast机制需要发送方和接收方明确知道对方的存在&#xff0c;并且需要在代码中设置Intent过滤器和广…

安装Harbor

前言 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器&#xff0c;虽然Docker官方也提供了公共的镜像仓库&#xff0c;但是从安全和效率等方面考虑&#xff0c;部署企业内部的私有环境Registry是非常必要的&#xff0c;Harbor和docker中央仓库的关系&#xff0c;…

2023牛客多校第三场 B.Auspiciousness

传送门 前题提要:没得说,赛时根本没想到dp,赛后翻各大题解看了很久,终于懂了dp的做法,故准备写一篇题解. 首先,先定义一下我们的 d p dp dp方程,考虑将处于 [ 1 , n ] [1,n] [1,n]的数当做小数,将处于 [ n 1 , 2 ∗ n ] [n1,2*n] [n1,2∗n]的数当做大数.那么对于我们的摸牌结…

CEC2022代码(Matlab代码)及多种智能优化算法求解CEC2022

一、CEC2022测试函数 CEC2022测试集共有12个单目标测试函数&#xff0c;每个测试函数可选择的维度分别为10维、20维。该测试集合也是目前高质量论文应用最广泛的测试集&#xff0c;CEC2022测试集函数复杂&#xff0c;非常具有挑战力。 CEC2022测试函数与理论最优值 二、多种智…

hcip——ospf综合

要求 1. 搭建toop 2.地址规划 协议范围路由器地址 RIP 172.16.0.0 17 R12 loop0&#xff1a;172.16.0.0 24 loop1&#xff1a;172.16.1.0 24 OSPF 172.16.128.0 17 area1 172.16.144.0 20 R1 g0:172.16.144.1 24 loop0:172.16.145.1 24 R2 g0:172.16.144.2 24 loop:172…

微信小程序:实现提示窗确定,取消执行不同操作(消息提示确认取消)showModal

效果 代码 wx.showModal({title: 提示,content: 是否确认退出,success: function (res) {if (res.confirm) {console.log(用户点击确定)} else if (res.cancel) {console.log(用户点击取消)}}})

常用css 笔记

0、定义变量 :root { --primary-color: #007bff;} .button { background-color: var(--primary-color);} 1、水平垂直居中 div {width: 100px;height: 100px;position: absolute;top: 0;right: 0;bottom: 0;left: 0;margin: auto; }父级控制子集居中 .parent {display: fle…

【广州华锐互动】VR模拟灭火逃生体验系统

VR模拟灭火逃生体验系统由广州华锐互动开发&#xff0c;是一种基于虚拟现实技术的应急演练与培训系统&#xff0c;可以真实模拟消防逃生场景&#xff0c;让体验者在沉浸式的虚拟环境中&#xff0c;根据正确的消防逃生方法提示&#xff0c;进行自救演练。这种科学普及方法是更加…

【线程安全的讨论(一)】CPU多核缓存架构和JMM

CPU多核缓存架构 一、CPU多核缓存架构可见性问题乱序执行&#xff08;指令重排&#xff09; 二、JMM——Java内存模型 一、CPU多核缓存架构 计算机的基本组成图 CPU 缓存为了提高程序运行的性能&#xff0c;现代 CPU 在很多方面会对程序进行优化。CPU 的处理速度很快&#xf…

ICMP隐蔽隧道攻击分析与检测

• ICMP隧道攻击工具特征分析 一、原理 由于ICMP报文自身可以携带数据&#xff0c;而且ICMP报文是由系统内核处理的&#xff0c;不占用任何端口&#xff0c;因此具有很高的隐蔽性。 通过改变操作系统默认填充的Data&#xff0c;替换成自己构造的数据&#xff0c;这就是ICMP隐…

simulink与遗传算法结合求解TSP问题

前言&#xff1a;刚开始入门学习simulink&#xff0c;了解了基本的模块功能后想尝试从自己熟悉的领域入手&#xff0c;自己出题使用simulink搭建模型。选择的是TSP问题的遗传算法&#xff0c;考虑如何用simulink建模思想来实现一个简单TSP问题的遗传算法。 TSP问题描述 一个配…

【深度学习】基于图形的机器学习:概述

一、说明 图神经网络&#xff08;GNN&#xff09;在数据科学和机器学习中越来越受到关注&#xff0c;但在专家圈之外仍然知之甚少。为了掌握这种令人兴奋的方法&#xff0c;我们必须从更广泛的图形机器学习&#xff08;GML&#xff09;领域开始。许多在线资源谈论GNN和GML&…

SSIS对SQL Server向Mysql数据转发表数据 (一)

开发工具 Visual Stuido 2019 、SSIS、SQL Server 2016、Mysql 8.0.30 1、配置VS2019的添加相应的功能&#xff0c;勾选SQL Server Data Tools,下载就行我用的VS2019版本还需要下载下面几个插件&#xff0c;链接我放在下面了 Microsoft Analysis Services Projects - Visual St…