【题解】—— LeetCode一周小结44
🌟欢迎来到 我的博客 —— 探索技术的无限可能!
🌟博客的简介(文章目录)
【题解】—— 每日一道题目栏
上接:【题解】—— LeetCode一周小结43
28.冗余连接 II
题目链接:685. 冗余连接 II
在本问题中,有根树指满足以下条件的 有向 图。该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。
输入一个有向图,该图由一个有着 n 个节点(节点值不重复,从 1 到 n)的树及一条附加的有向边构成。附加的边包含在 1 到 n 中的两个不同顶点间,这条附加的边不属于树中已存在的边。
结果图是一个以边组成的二维数组 edges 。 每个元素是一对 [ui, vi],用以表示 有向 图中连接顶点 ui 和顶点 vi 的边,其中 ui 是 vi 的一个父节点。
返回一条能删除的边,使得剩下的图是有 n 个节点的有根树。若有多个答案,返回最后出现在给定二维数组的答案。
示例 1:
输入:edges = [[1,2],[1,3],[2,3]]
输出:[2,3]
示例 2:
输入:edges = [[1,2],[2,3],[3,4],[4,1],[1,5]]
输出:[4,1]
提示:
n == edges.length
3 <= n <= 1000
edges[i].length == 2
1 <= ui, vi <= n
题解:
方法:并查集
class Solution {private int[] p;public int[] findRedundantDirectedConnection(int[][] edges) {int n = edges.length;int[] ind = new int[n];for (var e : edges) {++ind[e[1] - 1];}List<Integer> dup = new ArrayList<>();p = new int[n];for (int i = 0; i < n; ++i) {if (ind[edges[i][1] - 1] == 2) {dup.add(i);}p[i] = i;}if (!dup.isEmpty()) {for (int i = 0; i < n; ++i) {if (i == dup.get(1)) {continue;}int pu = find(edges[i][0] - 1);int pv = find(edges[i][1] - 1);if (pu == pv) {return edges[dup.get(0)];}p[pu] = pv;}return edges[dup.get(1)];}for (int i = 0;; ++i) {int pu = find(edges[i][0] - 1);int pv = find(edges[i][1] - 1);if (pu == pv) {return edges[i];}p[pu] = pv;}}private int find(int x) {if (p[x] != x) {p[x] = find(p[x]);}return p[x];}
}
29.生成不含相邻零的二进制字符串
题目链接:3211. 生成不含相邻零的二进制字符串
给你一个正整数 n。
如果一个二进制字符串 x 的所有长度为 2 的
子字符串
中包含 至少 一个 “1”,则称 x 是一个 有效 字符串。
返回所有长度为 n 的 有效 字符串,可以以任意顺序排列。
示例 1:
输入: n = 3
输出: [“010”,“011”,“101”,“110”,“111”]
解释:
长度为 3 的有效字符串有:“010”、“011”、“101”、“110” 和 “111”。
示例 2:
输入: n = 1
输出: [“0”,“1”]
解释:
长度为 1 的有效字符串有:“0” 和 “1”。
提示:
1 <= n <= 18
题解:
方法:回溯(爆搜)
class Solution {public List<String> validStrings(int n) {List<String> ans = new ArrayList<>();char[] path = new char[n];dfs(0, n, path, ans);return ans;}private void dfs(int i, int n, char[] path, List<String> ans) {if (i == n) {ans.add(new String(path));return;}// 填 1path[i] = '1';dfs(i + 1, n, path, ans);// 填 0if (i == 0 || path[i - 1] == '1') {path[i] = '0'; // 直接覆盖dfs(i + 1, n, path, ans);}}
}
30.交换后字典序最小的字符串
题目链接:3216. 交换后字典序最小的字符串
给你一个仅由数字组成的字符串 s,在最多交换一次 相邻 且具有相同 奇偶性 的数字后,返回可以得到的
字典序最小的字符串
。
如果两个数字都是奇数或都是偶数,则它们具有相同的奇偶性。例如,5 和 9、2 和 4 奇偶性相同,而 6 和 9 奇偶性不同。
示例 1:
输入: s = “45320”
输出: “43520”
解释:
s[1] == ‘5’ 和 s[2] == ‘3’ 都具有相同的奇偶性,交换它们可以得到字典序最小的字符串。
示例 2:
输入: s = “001”
输出: “001”
解释:
无需进行交换,因为 s 已经是字典序最小的。
提示:
2 <= s.length <= 100
s 仅由数字组成。
题解:
方法:贪心
class Solution {public String getSmallestString(String s) {char[] t = s.toCharArray();for (int i = 1; i < t.length; i++) {char x = t[i - 1];char y = t[i];if (x > y && x % 2 == y % 2) {t[i - 1] = y;t[i] = x;break;}}return new String(t);}
}
31.不包含相邻元素的子序列的最大和
题目链接:3165. 不包含相邻元素的子序列的最大和
给你一个整数数组 nums 和一个二维数组 queries,其中 queries[i] = [posi, xi]。
对于每个查询 i,首先将 nums[posi] 设置为 xi,然后计算查询 i 的答案,该答案为 nums 中 不包含相邻元素 的
子序列
的 最大 和。
返回所有查询的答案之和。
由于最终答案可能非常大,返回其对 109 + 7 取余 的结果。
子序列 是指从另一个数组中删除一些或不删除元素而不改变剩余元素顺序得到的数组。
示例 1:
输入:nums = [3,5,9], queries = [[1,-2],[0,-3]]
输出:21
解释:
执行第 1 个查询后,nums = [3,-2,9],不包含相邻元素的子序列的最大和为 3 + 9 = 12。
执行第 2 个查询后,nums = [-3,-2,9],不包含相邻元素的子序列的最大和为 9 。
示例 2:
输入:nums = [0,-1], queries = [[0,-5]]
输出:0
解释: 执行第 1 个查询后,nums = [-5,-1],不包含相邻元素的子序列的最大和为 0(选择空子序列)。
提示:
1 <= nums.length <= 5 * 104
-105 <= nums[i] <= 105
1 <= queries.length <= 5 * 104
queries[i] == [posi, xi]
0 <= posi <= nums.length - 1
-105 <= xi <= 105
题解:
方法:分治思想+线段树
class Solution {public int maximumSumSubsequence(int[] nums, int[][] queries) {int n = nums.length;// 4 个数分别保存 f00, f01, f10, f11long[][] t = new long[2 << (32 - Integer.numberOfLeadingZeros(n))][4];build(t, nums, 1, 0, n - 1);long ans = 0;for (int[] q : queries) {update(t, 1, 0, n - 1, q[0], q[1]);ans += t[1][3]; // 注意 f11 没有任何限制,也就是整个数组的打家劫舍}return (int) (ans % 1_000_000_007);}// 合并左右儿子private void maintain(long[][] t, int o) {long[] a = t[o * 2];long[] b = t[o * 2 + 1];t[o][0] = Math.max(a[0] + b[2], a[1] + b[0]);t[o][1] = Math.max(a[0] + b[3], a[1] + b[1]);t[o][2] = Math.max(a[2] + b[2], a[3] + b[0]);t[o][3] = Math.max(a[2] + b[3], a[3] + b[1]);}// 用 nums 初始化线段树private void build(long[][] t, int[] nums, int o, int l, int r) {if (l == r) {t[o][3] = Math.max(nums[l], 0);return;}int m = (l + r) / 2;build(t, nums, o * 2, l, m);build(t, nums, o * 2 + 1, m + 1, r);maintain(t, o);}// 把 nums[i] 改成 valprivate void update(long[][] t, int o, int l, int r, int i, int val) {if (l == r) {t[o][3] = Math.max(val, 0);return;}int m = (l + r) / 2;if (i <= m) {update(t, o * 2, l, m, i, val);} else {update(t, o * 2 + 1, m + 1, r, i, val);}maintain(t, o);}
}
2024.11
1.超级饮料的最大强化能量
题目链接:3259. 超级饮料的最大强化能量
来自未来的体育科学家给你两个整数数组 energyDrinkA 和 energyDrinkB,数组长度都等于 n。这两个数组分别代表 A、B 两种不同能量饮料每小时所能提供的强化能量。
你需要每小时饮用一种能量饮料来 最大化 你的总强化能量。然而,如果从一种能量饮料切换到另一种,你需要等待一小时来梳理身体的能量体系(在那个小时里你将不会获得任何强化能量)。
返回在接下来的 n 小时内你能获得的 最大 总强化能量。
注意 你可以选择从饮用任意一种能量饮料开始。
示例 1:
输入:energyDrinkA = [1,3,1], energyDrinkB = [3,1,1]
输出:5
解释:
要想获得 5 点强化能量,需要选择只饮用能量饮料 A(或者只饮用 B)。
示例 2:
输入:energyDrinkA = [4,1,1], energyDrinkB = [1,1,3]
输出:7
解释:
第一个小时饮用能量饮料 A。
切换到能量饮料 B ,在第二个小时无法获得强化能量。
第三个小时饮用能量饮料 B ,并获得强化能量。
提示:
n == energyDrinkA.length == energyDrinkB.length
3 <= n <= 105
1 <= energyDrinkA[i], energyDrinkB[i] <= 105
题解:
方法:递归搜索 + 保存递归返回值 = 记忆化搜索
class Solution {public long maxEnergyBoost(int[] a, int[] b) {int n = a.length;int[][] c = {a, b};long[][] memo = new long[n][2];return Math.max(dfs(n - 1, 0, c, memo), dfs(n - 1, 1, c, memo));}private long dfs(int i, int j, int[][] c, long[][] memo) {if (i < 0) {return 0;}if (memo[i][j] > 0) { // 之前计算过return memo[i][j];}return memo[i][j] = Math.max(dfs(i - 1, j, c, memo), dfs(i - 2, j ^ 1, c, memo)) + c[j][i];}
}
2.使两个整数相等的位更改次数
题目链接:3226. 使两个整数相等的位更改次数
给你两个正整数 n 和 k。
你可以选择 n 的 二进制表示 中任意一个值为 1 的位,并将其改为 0。
返回使得 n 等于 k 所需要的更改次数。如果无法实现,返回 -1。
示例 1:
输入: n = 13, k = 4
输出: 2
解释: 最初,n 和 k 的二进制表示分别为 n = (1101)2 和 k = (0100)2,
我们可以改变 n 的第一位和第四位。结果整数为 n = (0100)2 = k。
示例 2:
输入: n = 21, k = 21
输出: 0
解释: n 和 k 已经相等,因此不需要更改。
示例 3:
输入: n = 14, k = 13
输出: -1
解释: 无法使 n 等于 k。
提示:
1 <= n, k <= 106
题解:
方法:O(1) 位运算做法
class Solution {public int minChanges(int n, int k) {return (n & k) != k ? -1 : Integer.bitCount(n ^ k);}
}
3.大礼包
题目链接:638. 大礼包
在 LeetCode 商店中, 有 n 件在售的物品。每件物品都有对应的价格。然而,也有一些大礼包,每个大礼包以优惠的价格捆绑销售一组物品。
给你一个整数数组 price 表示物品价格,其中 price[i] 是第 i 件物品的价格。另有一个整数数组 needs 表示购物清单,其中 needs[i] 是需要购买第 i 件物品的数量。
还有一个数组 special 表示大礼包,special[i] 的长度为 n + 1 ,其中 special[i][j] 表示第 i 个大礼包中内含第 j 件物品的数量,且 special[i][n] (也就是数组中的最后一个整数)为第 i 个大礼包的价格。
返回 确切 满足购物清单所需花费的最低价格,你可以充分利用大礼包的优惠活动。你不能购买超出购物清单指定数量的物品,即使那样会降低整体价格。任意大礼包可无限次购买。
示例 1:
输入:price = [2,5], special = [[3,0,5],[1,2,10]], needs = [3,2]
输出:14
解释:有 A 和 B 两种物品,价格分别为 ¥2 和 ¥5 。
大礼包 1 ,你可以以 ¥5 的价格购买 3A 和 0B 。
大礼包 2 ,你可以以 ¥10 的价格购买 1A 和 2B 。
需要购买 3 个 A 和 2 个 B , 所以付 ¥10 购买 1A 和 2B(大礼包 2),以及 ¥4 购买 2A 。
示例 2:
输入:price = [2,3,4], special = [[1,1,0,4],[2,2,1,9]], needs = [1,2,1]
输出:11
解释:A ,B ,C 的价格分别为 ¥2 ,¥3 ,¥4 。
可以用 ¥4 购买 1A 和 1B ,也可以用 ¥9 购买 2A ,2B 和 1C 。
需要买 1A ,2B 和 1C ,所以付 ¥4 买 1A 和 1B(大礼包 1),以及 ¥3 购买 1B , ¥4 购买 1C 。
不可以购买超出待购清单的物品,尽管购买大礼包 2 更加便宜。
提示:
n == price.length == needs.length
1 <= n <= 6
0 <= price[i], needs[i] <= 10
1 <= special.length <= 100
special[i].length == n + 1
0 <= special[i][j] <= 50
生成的输入对于 0 <= j <= n - 1 至少有一个 special[i][j] 非零。
题解:
方法:状态压缩 + 记忆化搜索
class Solution {private final int bits = 4;private int n;private List<Integer> price;private List<List<Integer>> special;private Map<Integer, Integer> f = new HashMap<>();public int shoppingOffers(List<Integer> price, List<List<Integer>> special, List<Integer> needs) {n = needs.size();this.price = price;this.special = special;int mask = 0;for (int i = 0; i < n; ++i) {mask |= needs.get(i) << (i * bits);}return dfs(mask);}private int dfs(int cur) {if (f.containsKey(cur)) {return f.get(cur);}int ans = 0;for (int i = 0; i < n; ++i) {ans += price.get(i) * (cur >> (i * bits) & 0xf);}for (List<Integer> offer : special) {int nxt = cur;boolean ok = true;for (int j = 0; j < n; ++j) {if ((cur >> (j * bits) & 0xf) < offer.get(j)) {ok = false;break;}nxt -= offer.get(j) << (j * bits);}if (ok) {ans = Math.min(ans, offer.get(n) + dfs(nxt));}}f.put(cur, ans);return ans;}
}
下接:【题解】—— LeetCode一周小结45
相关文章:

【题解】—— LeetCode一周小结44
🌟欢迎来到 我的博客 —— 探索技术的无限可能! 🌟博客的简介(文章目录) 【题解】—— 每日一道题目栏 上接:【题解】—— LeetCode一周小结43 28.冗余连接 II 题目链接:685. 冗余连接 II 在…...

faiss 用于检索10亿向量(维度768)的方法
faiss 用检索10亿向量(维度768)的方法,注意考虑占用内存空间大小不能超过100G,因为100G已经是很多服务器内存的极限了,有的128G已经是超规格的机器了。价格也就是2000左右(月租)。 要处理 10 亿个 768 维的向量,并且限制内存占用不超过 100G,我们需要使用 FAISS 中的…...

sql专题 之 常用命令
文章目录 查询基础语法查询全表查询选择查询:常量和运算: 条件查询where运算符:、 !、<、>空值:null模糊查询:like逻辑运算:and or not 去重:distinct排序:order by截断和偏移…...

Kubernetes Extended Resource 扩展资源使用简介
Kubernetes 除了提供基于 CPU 和内存的传统计算资源调度外,还支持自定义的 Extended Resource 扩展资源,以便调度和管理其它各种类型的资源。 Extended Resource Extended Resource 扩展资源的创建和使用过程如下图所示: 定义资源ÿ…...

基于STM32的天气时钟项目教学
引言 随着物联网技术的普及,基于STM32的微控制器被广泛应用于各种智能设备的开发。本项目旨在打造一个基于STM32的天气时钟,除了显示当前时间,还可以通过Wi-Fi获取当地天气信息,提供一个实用的生活工具。 环境准备 在开始项目之前…...

神经网络进行波士顿房价预测
前言 前一阵学校有五一数模节校赛,和朋友一起参加做B题,波士顿房价预测,算是第一次自己动手实现一个简单的小网络吧,虽然很简单,但还是想记录一下。 题目介绍 波士顿住房数据由哈里森和鲁宾菲尔德于1978年Harrison …...

C++builder中的人工智能(7)如何在C++中开发特别的AI激活函数?
在当今的AI开发中,人工智能模型正迅速增加。这些模型使用数学函数来执行和学习,以便在传播时优化最佳结果,或在反向传播时选择最佳解决方案。其中之一就是激活函数。也称为转移函数或阈值函数,它决定了神经元的激活值作为输出&…...

更改lvgl图片的分辨率(减少像素)达到减小内存占用的目的
lvgl的内存占比过大,更改图片的分辨率(减少像素)达到减小内存占用的目的,可以用更多的空间去开发其他的功能 -- 由于lvgl中图片占的内存过大,所以需要更改图片的分辨率(降低像素的方式) --注意…...

python的socket库的基本使用总目录
章节总目录 一、Python 实现UDP通讯的简单模型 二、Python 实现TCP通讯的简单模型 三、Python 实现TCP和UDP通讯代码的区别...

golang学习3
Go 语言之旅...

Python解力扣算法题(六)(详解+注释)
# 1.学校打算为全体学生拍一张年度纪念照。根据要求,学生需要按照 非递减 的高度顺序排成一行。 # 排序后的高度情况用整数数组 expected 表示,其中 expected[i] 是预计排在这一行中第 i 位的学生的高度(下标从 0 开始)。 # 给你一…...

【C++】继承和多态常见的面试问题
文章目录 继承笔试面试题1. 什么是菱形继承?菱形继承的问题是什么?2. 什么是菱形虚拟继承?如何解决数据冗余和二义性?3. 继承和组合的区别?什么时候用继承?什么时候用组合? 选择题 多态概念考察…...

入门网络安全工程师要学习哪些内容(详细教程)
🤟 基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 大家都知道网络安全行业很火,这个行业因为国家政策趋势正在大力发展,大有可为!但很多人对网络安全工程师还是不了解,不知道网…...

【游戏引擎之路】登神长阶(十二)——DirectX11教程:If you‘re going through hell, keep going!
【游戏引擎之路】登神长阶(十二)——DirectX11教程:If youre going through hell, keep going! 2024年 5月20日-6月4日:攻克2D物理引擎。 2024年 6月4日-6月13日:攻克《3D数学基础》。 2024年 6月13日-6月20日&#x…...

Python列表(一图秒了)
一、概念 所谓的列表是由一些列按照顺序存储的元素组成,区别于C语言中的数组,可以存储多种类型的数据,其中元素之间是没有任何关系的。 注意: 元素放在[]里面的,多个元素之间用 逗号 隔开列表的元素可以修改 定义 …...

雷池社区版 7.1.0 LTS 发布了
LTS(Long Term Support,长期支持版本)是软件开发中的一个概念,表示该版本将获得较长时间的支持和更新,通常包含稳定性、性能改进和安全修复,但不包含频繁的新特性更新。 作为最受欢迎的社区waf,…...

推荐一款功能强大的数据库开发管理工具:SQLite Expert Pro
SQLite Expert Professional是一个功能强大的工具,旨在简化SQLite3数据库的开发。 它是SQLite的一个功能丰富的管理和开发工具,旨在满足所有用户从编写简单SQL查询到开发复杂数据库的需求。 图形界面支持所有SQLite功能。 它包括一个可视化查询构建器&a…...

动态规划 之 路径问题 算法专题
一. 不同路径 不同路径 状态表示 dp[i][j] 表示走到[i][j]位置, 有几种不同的路径状态转移方程 以离[i][j] 最近的位置划分问题 1.从[i - 1][j] 到[i][j], 到[i][j]位置的不同路径数 就是和 到[i - 1][j]位置的不同路径数相同, 即dp[i][j] dp[i - 1][j] 2.从[i][j - 1] 到[i…...

从office套件接入GPT4谈自动化测试的前景
微软前几天发布了集成了GPT-4模型的office套件,从演示视频看,大概可以做这样一些事情 输入指令自动做表输入指令写邮件输入指定自动做ppt,而且一做就是好多页,挺震撼的 稍微了解了一下原理,大概流程是 用户发送prom…...

CentOS操作系统安装过程简介
以下是在CentOS(以CentOS 7为例)中使用Anaconda安装器的一般步骤: 1. 准备工作 - 首先,需要获取CentOS 7的安装介质,可以是光盘或者制作好的USB启动盘。然后将计算机设置为从对应的安装介质启动。 2. 启动安装程序 -…...

基于Multisim光控夜灯LED电路(含仿真和报告)
【全套资料.zip】光控夜灯LED电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 1.采用纯数字电路,非单片机。 2.通过检测周围光线,光线暗且有声音时自动开灯…...

导师双选系统开发:Spring Boot技术详解
第一章 绪论 1.1 选题背景 如今的信息时代,对信息的共享性,信息的流通性有着较高要求,尽管身边每时每刻都在产生大量信息,这些信息也都会在短时间内得到处理,并迅速传播。因为很多时候,管理层决策需要大量信…...

双11花了“一部手机钱”买手机壳的年轻人,究竟在买什么?
【潮汐商业评论/原创】 这个双十一,Elsa在天猫多了一笔新支出——手机壳。和大家都熟悉的“义乌制造”不同的是,她的手机壳支出单件就已经到了500块,加上配套的手机链、支架、卡包、耳机壳,总共1000多元,足够买一部学…...

rediss数据结构及其底层实现
Redis 是一个基于内存的高性能键值对数据库,它支持多种数据结构,每种数据结构都有其特定的底层实现。以下是Redis中一些主要数据结构及其底层实现: 字符串(String): Redis的字符串类型使用简单动态字符串&a…...

自动化测试中使用Pytest Fixture?推荐10种常见用法!
Pytest 是一个功能强大的 Python 测试框架,其中的Fixture 是 Pytest 中的一个重要功能。它允许你设置一些特定的测试环境或准备测试数据,这些环境和数据可以在多个测试用例中重复使用。通过使用fixture,你可以避免在每个测试函数中编写重复的…...

Spring中的ConversionService,为Spring提供数据转换服务
在Spring中经常需要各种数据类型之间进行转换,比如配置文件中的数据转换为代码所需要的数据类型,在使用SpringMvc的时候,将前台传来的参数自动转换为我们接收参数时定义的类型。 Spring中的ConversionService就是提供这种服务的 1.DefaultC…...

gdb和make工具
gdb工具: GDB的主要功能 断点设置:允许开发者在特定的代码行设置断点,当程序执行到该行时会自动暂停,方便开发者进行调试和分析。 变量查看与修改:在程序运行过程中,可以查看和修改变量的值,以…...

【d66】【Java】【力扣】174.寻找二叉搜索树中的目标节点
思路 反着的中序遍历,并计数 代码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNo…...

Spring Boot关闭时,如何确保内存里面的mq消息被消费完?
1.背景 之前写一篇文章Spring Boot集成disruptor快速入门demo,有网友留言如下图: 针对网友的留言,那么我们如何解决这个问题呢 Spring-Boot应用停机时,如何保证其内存消息都处理完成? 2.解决方法 方法其实挺简单的&…...

HTML 基础标签——文本内容标签 <ul>、<ol>、<blockquote> 、<code> 等标签的用法详解
文章目录 1. 标题标签2. 段落标签3. 文本格式化标签4. 列表标签4.1 无序列表 `<ul>`4.2 有序列表 `<ol>`5. 引用标签5.1 块引用 `<blockquote>`5.2 行内引用 `<q>`5.3 作品引用 `<cite>`6. 代码和预格式文本标签6.1 代码标签 `<code>`6.2 …...