当前位置: 首页 > news >正文

LeetCode 周赛上分之旅 #42 当 LeetCode 考树上倍增,出题的趋势在变化吗

⭐️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。

学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。

本文是 LeetCode 上分之旅系列的第 42 篇文章,往期回顾请移步到文章末尾~

周赛 360

T1. 距离原点最远的点(Easy)

  • 标签:模拟

T2. 找出美丽数组的最小和(Medium)

  • 标签:散列表、贪心、数学

T3. 使子序列的和等于目标的最少操作次数(Hard)

  • 标签:位运算、散列表、排序

T4. 在传球游戏中最大化函数值(Hard)

  • 标签:树、倍增、动态规划、内向基环树


T1. 距离原点最远的点(Easy)

https://leetcode.cn/problems/furthest-point-from-origin/

题解(模拟)

根据题意 “_” 既可以作为 “L” 也可以作为 “R”。容易想到,为了使得终点距离原点更远,当所有 “_” 仅作为 “L” 或 “R” 对结果的贡献是最优的,此时问题的结果就取决于 “L” 和 “R” 的差绝对值。

class Solution {fun furthestDistanceFromOrigin(moves: String): Int {return moves.count{ it == '_' } + abs(moves.count{ it == 'L' } - moves.count{ it == 'R' })}
}

一次遍历:

class Solution {fun furthestDistanceFromOrigin(moves: String): Int {var cntL = 0var cntR = 0for (e in moves) {when (e) {'L' -> {cntL ++cntR --}'R' -> {cntL --cntR ++}else -> {cntL ++cntR ++}}}return max(abs(cntL), abs(cntR))}
}

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n) 线性遍历;
  • 空间复杂度: O ( 1 ) O(1) O(1) 仅使用常量级别空间。

T2. 找出美丽数组的最小和(Medium)

https://leetcode.cn/problems/find-the-minimum-possible-sum-of-a-beautiful-array/

这道题与上周周赛 359 T2 2829. k-avoiding 数组的最小总和 相比,除了数据范围之外是完全相同的,有点离谱。

题解一(散列表 + 贪心)

1 1 1 开始从小到大枚举,如果当前元素 c u r cur cur 与已选列表不冲突,则加入结果中。为了验证是否冲突,我们使用散列表在 O ( 1 ) O(1) O(1) 时间复杂度判断。

class Solution {fun minimumPossibleSum(n: Int, k: Int): Long {val set = HashSet<Int>()var sum = 0Lvar cur = 1repeat(n) {while (!set.isEmpty() && set.contains(k - cur)) cur++sum += curset.add(cur)cur++}return sum}
}

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n) 线性遍历;
  • 空间复杂度: O ( n ) O(n) O(n) 散列表空间。

题解二(数学)

这道题还可以继续挖掘数学规律,我们发现当我们从 1 1 1 开始从小到大枚举时,每选择一个数的同时必然会使得另一个数 k − x k - x kx 不可选。例如:

  • 选择 1 1 1,则 k − 1 k - 1 k1 不可选;
  • 选择 2 2 2,则 k − 2 k - 2 k2 不可选;
  • 选择 k / 2 k / 2 k/2,则 k − k / 2 k - k / 2 kk/2 不可选。

可以发现,最终选择的元素被分为两部分:

  • 小于 k k k 的部分:选择所有和为 k k k 的配对中的较小值,即 1 、 2 、 3 … k / 2 1、2、3 … k / 2 123k/2
  • 大于等于 k k k 的部分:与其他任意正整数相加都不会等于 k k k,因此大于等于 k k k 的数必然可以选择,即 k 、 k + 1 、 k + 2 、 … 、 k + n − m − 1 k、k + 1、k + 2、…、k + n - m - 1 kk+1k+2k+nm1 共 n - m 个数。

我们令 m = m i n ( k / 2 , n ) m = min(k / 2, n) m=min(k/2,n),使用求和公式可以 O ( 1 ) O(1) O(1) 求出两部分的总和:

  • 小于 k 的部分: m ( m + 1 ) / 2 m(m + 1)/ 2 m(m+1)/2
  • 大于等于 k 的部分: ( n − m ) ∗ ( 2 ∗ k + n − m − 1 ) / 2 (n - m) * (2*k + n - m - 1) / 2 (nm)(2k+nm1)/2
class Solution {fun minimumPossibleSum(n: Int, k: Int): Long {val m = 1L * Math.min(n, k / 2)return m * (m + 1) / 2 + (n - m) * (2 * k + n - m - 1) / 2}
}

复杂度分析:

  • 时间复杂度: O ( 1 ) O(1) O(1)
  • 空间复杂度: O ( 1 ) O(1) O(1)

T3. 使子序列的和等于目标的最少操作次数(Hard)

https://leetcode.cn/problems/minimum-operations-to-form-subsequence-with-target-sum/

这道题的考点不复杂,难点在模拟问题挺考验编码功底的。

问题分析

  • 关键信息: n u m s nums nums 数组中所有元素都是 2 2 2 的幂,元素顺序对结果没有影响;
  • 问题是否有解: 考虑到所有数最终都能拆分成 1 1 1,那么只要 n u m s nums nums 数组的和大于等于 t a r g e t target target 就一定有解;
# 二进制位
nums:   _ _ _ 1 _ _ _ _
target: _ _ _ _ _ 1 _ _
  • 子问题: 问题是否有解的判断不仅适用于原问题,对于仅考虑二进制位最低位 [ 0 ] [0] [0] [ k ] [k] [k] 的子问题亦是如此。

以示例 1 nums = [1,2,8], target = 7 与示例 2 nums = [1,32,1,2], target = 12 为例,我们将统计 n u m s nums nums 中不同 2 2 2 的幂的出现次数:

# 二进制位
nums:   _ _ _ _ 1 _ 1 1
target: _ _ _ _ _ 1 1 1# 二进制位
nums:   _ _ 1 _ _ _ 1 2 # 1 出现 2 次
target: _ _ _ _ 1 1 _ _

那么当我们从右向左枚举二进制位 k k k 时,如果「 n u m s nums nums 中小于等于 2 k 2^k 2k 的元素和」 ≥ ≥ t a r g e t target target 中低于等于 k k k 位的值」,那么对于仅考虑 [ 0 , k ] [0, k] [0,k] 位上的子问题是有解的。否则,我们需要找到 n u m s nums nums 中最近大于 2 k 2^k 2k 的最近数组做拆分:

# 只考虑低 2 位,可以构造
nums:   _ _ _ _ 1 _ | 1 1
target: _ _ _ _ _ 1 | 1 1# 只考虑低 3 位,无法构造,需要找到最近的 “1” 做拆分
nums:   _ _ _ _ 1 | _ 1 1
target: _ _ _ _ _ | 1 1 1# 只考虑低 3 位,无法构造,需要找到最近的 “1” 做拆分
nums:   _ _ 1 _ _ | _ 1 2
target: _ _ _ _ 1 | 1 _ _# 只考虑低 6 位,可以构造
nums:   _ _ | 1 _ _ _ 1 2
target: _ _ | _ _ 1 1 _ _

组合以上技巧:

写法一(数组模拟)

思路参考灵神的题解。

  • 首先,我们使用长为 32 32 32 的数组,计算出 n u m s nums nums 数组中每个 2 2 2 的幂的出现次数;
  • 随后,我们从低位到高位枚举二进制位 i i i,在每轮迭代中将 n u m s nums nums 数组中的 2 i 2^i 2i 元素累加到 s u m sum sum 中,此举相当于在求「低 i i i 位的子问题」可以构造的最大值;
  • 最后,我们比较 s u m sum sum 是否大于等于 t a r g e t target target(只考虑低 i i i 位),此举相当于在判断「低 i i i 位的子问题」是否可构造。如果不可构造,我们尝试寻找最近的 2 j 2^j 2j 做拆分;
  • 另外,有一个优化点:当我们拆分将 2 j 2^j 2j 拆分到 2 i ( j > i ) 2^i (j > i) 2i(j>i) 时并不是直接丢弃 2 j 2^j 2j,而是会留下 2 j − 1 、 2 j − 2 … 2 i 2^{j-1}、2^{j-2}… 2^i 2j12j22i 等一系列数,可以直接跳到第 j j j 位继续枚举。

注意一个容易 WA 的地方,在开头特判的地方,由于元素和可能会溢出 I n t Int Int 上界,所以我们需要转换为在 L o n g Long Long 上的求和。

class Solution {fun minOperations(nums: List<Int>, target: Int): Int {if (nums.fold(0L) { it, acc -> it + acc } < target) return -1// if (nums.sum() < target) return -1 // 溢出// 计数val cnts = IntArray(32)for (num in nums) {var i = 0var x = numwhile (x > 1) {x = x shr 1i += 1}cnts[i]++}var ret = 0var i = 0var sum = 0Lwhile(sum < target) {// 累加低位的 numssum += (cnts[i]) shl i// println("i=$i, sum=$sum")// 低 i 位掩码val mask = (1 shl (i + 1)) - 1// 构造子问题if (sum < target and mask) {var j = i + 1while (cnts[j] == 0) { // 基于开头的特判,此处一定有解j++}// 拆分ret += j - ii = j} else {i += 1}}return ret}
}

复杂度分析:

  • 时间复杂度: O ( n ⋅ U + U O(n·U + U O(nU+U) 其中 n n n n u m s nums nums 数组的长度, U U U 为整型大小 32 32 32
  • 空间复杂度: O ( U ) O(U) O(U) 数组空间。

写法二(散列表模拟)

在计数的部分,我们可以使用散列表模拟,复杂度相同。

class Solution {fun minOperations(nums: List<Int>, target: Int): Int {if (nums.fold(0L) { it, acc -> it + acc } < target) return -1// if (nums.sum() < target) return -1 // 溢出// 计数val cnts = HashMap<Int, Int>()for (num in nums) {cnts[num] = cnts.getOrDefault(num, 0) + 1}var ret = 0var i = 0var sum = 0Lwhile(sum < target) {// 累加低位的 numssum += (cnts[1 shl i] ?: 0) shl i// println("i=$i, sum=$sum")// 低 i 位掩码val mask = (1 shl (i + 1)) - 1// 构造子问题if (sum < target and mask) {var j = i + 1while (!cnts.containsKey(1 shl j)) { // 基于开头的特判,此处一定有解j++}// 拆分ret += j - ii = j} else {i += 1}}return ret}
}

复杂度分析:

  • 时间复杂度: O ( n + U ) O(n + U) O(n+U) 其中 n n n n u m s nums nums 数组的长度, U U U 为整型大小 32 32 32
  • 空间复杂度: O ( U ) O(U) O(U) 散列表空间。

写法三(逆向思维)

思路参考雪景式的题解,前两种写法是在从小到大枚举「选哪个」,我们也可以枚举「不选哪个」。

  • 思考 1: 在原问题有解 ( s u m > t a r g e t ) (sum > target) sum>target的情况下,如果从 s u m sum sum 中剔除最大的元素 x x x 后,依然满足剩余的元素和 s u m ’ > t a r g e t sum’ > target sum>target,那么直接将 x x x 去掉,这是因为一定存在比 x x x 操作次数更小的方案能够构造 t a r g e t target target(元素越大拆分次数越多)。
  • 思考 2: 如果从 s u m sum sum 中剔除最大的元素 x x x 后不能构造,说明 x x x 是一定要选择或者拆分,此时考虑 x x x t a r g e t target target 的影响:
    • 如果 x > t a r g e t x > target x>target,那么 x x x 需要先拆分
    • 如果 x ≤ t a r g e t x ≤ target xtarget,那么 x x x 可以被选择并抵消 t a r g e t target target
class Solution {fun minOperations(nums: MutableList<Int>, target: Int): Int {var sum = nums.fold(0L) { it, acc -> it + acc }if (sum < target) return -1// 排序nums.sortDescending()// 从大到小枚举var ret = 0var left = targetwhile (sum > left) {val x = nums.removeFirst()if (sum - x >= left){sum -= x} else if (x <= left) {sum -= xleft -= x} else {ret += 1nums.add(0, x / 2)nums.add(0, x / 2)}// println("ret=$ret, sum=$sum, left=$left, x=$x,  nums=${nums.joinToString()}")}return ret}
}

复杂度分析:

  • 时间复杂度: O ( n l g n + n + U ) O(nlgn + n + U) O(nlgn+n+U) 瓶颈在排序,枚举阶段每个元素最多访问 1 1 1 次,拆分次数最多为 U U U
  • 空间复杂度: O ( l g n ) O(lgn) O(lgn) 排序递归栈空间。

T4. 在传球游戏中最大化函数值(Hard)

https://leetcode.cn/problems/maximize-value-of-function-in-a-ball-passing-game/

题解(树上倍增)

从近期周赛的趋势看,出题人似乎有意想把 LeetCode 往偏竞赛的题目引导。

这道题如果知道树上倍增算法,其实比第三题还简单一些。

  • 问题目标: 找到最佳方案,使得从起点开始传球 k k k 次的路径和最大化;
  • 暴力: 对于暴力的做法,我们可以枚举以每名玩家为起点的方案,并模拟传球过程求出最佳方案。但是这道题的步长 k k k 的上界非常大 1 0 10 10^{10} 1010,如果逐级向上传球,那么单次查询的时间复杂度是 O ( k ) O(k) O(k)。现在,需要思考如何优化模拟 k k k 次传球的效率;
  • 倍增思想: 借鉴 1483. 树节点的第 K 个祖先 的解法,我们可以利用倍增算法将线性的操作施加指数级别的贡献:
    • 如果可以预处理出每个玩家的多级后驱玩家,那么在查询时可以加速跳转;
    • 由于每个数都可以进行二进制拆分为多个 2 2 2 的幂的和,如果预处理出第 2 0 、 2 1 、 2 2 、 2 3 、 . . . 、 2 i 2^0、2^1、2^2、2^3、...、2^i 20212223...2i 个后驱玩家,那么求解第 k k k 次传球时可以转化为多次 2 i 2^i 2i 个后驱玩家跳转操作,大幅减少操作次数。
class Solution {fun getMaxFunctionValue(receiver: List<Int>, k: Long): Long {val n = receiver.sizeval m = 64 - k.countLeadingZeroBits()// 预处理// dp[i][j] 表示 i 传球 2^j 次后的节点val dp = Array(n) { IntArray(m) }// dp[i][j] 表示 i 传球 2^j 次的路径和val sum = Array(n) { LongArray(m) }for (i in 0 until n) {dp[i][0] = receiver[i]sum[i][0] = receiver[i].toLong()}for (j in 1 until m) {for (i in 0 until n) { // 这道题没有根节点,不需要考虑 child == -1 的情况val child = dp[i][j - 1]// 从 i 条 2^{j-1} 次,再跳 2^{j-1}dp[i][j] = dp[child][j - 1]sum[i][j] = sum[i][j - 1] + sum[child][j - 1]}}// 枚举方案var ret = 0Lfor (node in 0 until n) {var i = nodevar x = kvar s = node.toLong() // 起点的贡献while (x != 0L) {val j = x.countTrailingZeroBits()s += sum[i][j]i = dp[i][j]x = x and (x - 1)}ret = max(ret, s)}return ret}
}

复杂度分析:

  • 时间复杂度:预处理时间为 O ( n l g k ) O(nlgk) O(nlgk),枚举时间为 O ( n l g k ) O(nlgk) O(nlgk),其中 n n n r e c e i v e r s receivers receivers 数组的长度;
  • 空间复杂度:预处理空间 O ( n l g k ) O(nlgk) O(nlgk)

另外,这道题还有基于「内向基环树」的 O ( n ) O(n) O(n) 解法。


推荐阅读

LeetCode 上分之旅系列往期回顾:

  • LeetCode 单周赛第 359 场 · 结合离散化的线性 DP 问题
  • LeetCode 单周赛第 358 场 · 结合中心扩展的单调栈贪心问题
  • LeetCode 双周赛第 111 场 · 按部就班地解决动态规划问题
  • LeetCode 双周赛第 110 场 · 结合排序不等式的动态规划

⭐️ 永远相信美好的事情即将发生,欢迎加入小彭的 Android 交流社群~

相关文章:

LeetCode 周赛上分之旅 #42 当 LeetCode 考树上倍增,出题的趋势在变化吗

⭐️ 本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架&#xff0c;你的思考越抽象&#xff0c;它能覆盖的问题域就越广&#xff0c;理解难度…...

Qt 自定义菜单 托盘菜单

托盘菜单实现&#xff1a;通过QSystemTrayIconQMenuQAction即可完美实现&#xff01; 实现方式&#xff1a;createActions用于创建菜单、菜单项,translateActions用于设置文本、实现多语化&#xff0c;translateAccount用于设置用户空间配额。 void TrayMenu::createActions(…...

channel并发编程

不要通过共享内存通信&#xff0c;要通过通信共享内存。 channel是golang并发编程中一种重要的数据结构&#xff0c;用于多个goroutine之间进行通信。 我们通常可以把channel想象成一个传送带&#xff0c;将goroutine想象成传送带周边的人&#xff0c;一个传送带的上游放上物品…...

苹果新健康专利:利用 iPhone、Apple Watch 来分析佩戴者的呼吸情况

根据美国商标和专利局&#xff08;USPTO&#xff09;公示的清单&#xff0c;苹果获得了一项健康相关的技术专利&#xff0c;可以利用 iPhone、Apple Watch 来分析佩戴者的呼吸系统。 苹果在专利中概述了一种测量用户呼吸功能的系统&#xff0c;通过 iPhone 上的光学感测单元&am…...

数据分析基础-数据可视化02-不同数据类型的可视化概念及原则

将数据空间映射到颜色空间。 数据空间&#xff1a;连续或分类 数据可以被划分为两个主要的数据空间&#xff1a;连续数据和分类数据。这两种数据空间有不同的特点和适用的分析方法。 连续数据&#xff08;Continuous Data&#xff09;&#xff1a; 连续数据是指可以在某个范…...

QT项目使用Qss的总结

什么是QSS QSS称为Qt Style Sheets也就是Qt样式表&#xff0c;它是Qt提供的一种用来自定义控件外观的机制。QSS大量参考了CSS的内容&#xff0c;只不过QSS的功能比CSS要弱很多&#xff0c;体现在选择器要少&#xff0c;可以使用的QSS属性也要少很多&#xff0c;并且并不是所有…...

suricata初体验+wireshark流量分析

目录 一、suricata介绍 1.下载安装 2.如何使用-攻击模拟 二、wireshark流量分析 1.wireshark过滤器使用 2.wireshark其他使用 一、suricata介绍 1.下载安装 通过官网下载suricata&#xff0c;根据官网步骤进行安装。 官网地址&#xff1a; https://documentation.wazuh.…...

机器学习:异常检测实战

文章目录 Anomaly Detection目录任务介绍数据集方法评估Baseline报告报告评价标准 Anomaly Detection 目录 任务介绍 无监督的异常检测 数据集 方法 autoencode 是否能够还原出原始类型图片&#xff0c;基于重构loss来判断是否正常 重构误差当作异常分数 评估 采用ROC和AUC…...

数据结构1

数据结构是计算机科学中存储和组织数据的一种方式&#xff0c;它定义了数据的表示方式和对数据进行操作的方法&#xff0c;常见的数据结构包括数组、栈、链表、队列、树、图等。 目录 一、常见的数据结构 1.数组 2.栈 3.队列 4.链表 5.树 6.图 一、常见的数据结构 1.数…...

自然语言处理学习笔记(七)————字典树效率改进

目录 1. 首字散列其余二分的字典树 2.双数组字典树 3.AC自动机(多模式匹配) &#xff08;1&#xff09;goto表 &#xff08;2&#xff09;output表 &#xff08;3&#xff09;fail表 4.基于双数组字典树的AC自动机 字典树的数据结构在以上的切分算法中已经很快了&#x…...

forEach和map有什么区别,使用场景?

forEach和map有什么区别&#xff0c;使用场景&#xff1f; 区别什么意思&#xff1f;forEach: 不直接改变原始数组&#xff0c;但可以在回调中更改原始数组。 区别 forEach 和 map 都是数组的常用方法&#xff0c;但它们有不同的目的和用法。下面是它们之间的主要区别以及各自…...

【Spring Boot】SpringBoot完整实现社交网站系统

一个完整的社交网站系统需要涉及到用户登录、发布动态、关注、评论、私信等各方面。这里提供一个简单的实现示例&#xff0c;供参考。 前端代码 前端使用Vue框架&#xff0c;以下是部分代码示例&#xff1a; 登录页&#xff1a; <template><div><input type…...

Modbus转Profinet网关连接三菱变频器博图快速配置

本案例将分享如何使用兴达易控的modbus转profinet网关&#xff08;XD-MDPN100&#xff09;来连接西门子1200系列plc&#xff0c;并实现三菱变频器的485通讯兼容转modbusTCP通信。通过在博图中进行配置&#xff0c;我们可以实现设备之间的连接和通信。 首先&#xff0c;我们需要…...

8.9 【C语言】有关指针的小结

&#xff08;1&#xff09;首先要准确理解指针的含义。 &a是变量a的地址&#xff0c;也可称为变量a的指针。 指针变量是存放地址的变量。 指针变量的值是一个地址。 指针变量也称为地址变量&#xff0c;它的值是地址。 &#xff08;2&#xff09;在C语言中&#xff0c…...

WordPress Nginx伪静态规则设置以及二级目录规则

WordPress Nginx伪静态规则设置以及二级目录规则&#xff08;wordpress不是安装在根目录的情况&#xff09; 根目录下WordPress的伪静态规则&#xff1a; location / {if (-f $request_filename/index.html){rewrite (.*) $1/index.html break;}if (-f $request_filename/ind…...

2023年高教社杯 国赛数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 描述 …...

React内置函数之startTransition与useTransition

React内置函数之startTransition&#xff0c;useTransition 在React中&#xff0c;使用startTransition和useTransition这两个内置函数可以帮助我们更好地管理组件的过渡状态。这两个函数的出现&#xff0c;旨在提供一种简单而强大的方式&#xff0c;来处理组件状态的变化&…...

观察者模式简介

概念&#xff1a; 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;用于在对象之间建立一对多的依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;其相关依赖对象会自动收到通知并进行相应处理。 特点&#xff1a; 松耦合&a…...

统计程序两个点之间执行的指令数量

环境:支持perf ubuntu安装 apt-get install linux-tools-common linux-tools-generic linux-tools-uname -randroid 一般自带simpleperf 分析 两个点作差, 求中间结果; *(int*)nullptr 0;案例 断点 1 代码 #define SETPOINT(...) do { *(int*)nullptr 0; } while(0…...

时序预测 | MATLAB实现基于TSO-XGBoost金枪鱼算法优化XGBoost的时间序列预测(多指标评价)

时序预测 | MATLAB实现基于TSO-XGBoost金枪鱼算法优化XGBoost的时间序列预测(多指标评价) 目录 时序预测 | MATLAB实现基于TSO-XGBoost金枪鱼算法优化XGBoost的时间序列预测(多指标评价)预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现基于TSO-XGBoost金枪鱼算…...

java- ConcurrentHashMap 并发

1. ConcurrentHashMap 并发 1.1. 减小锁粒度 减小锁粒度是指缩小锁定对象的范围&#xff0c;从而减小锁冲突的可能性&#xff0c;从而提高系统的并发能力。减小锁粒度是一种削弱多线程锁竞争的有效手段&#xff0c;这种技术典型的应用是 ConcurrentHashMap(高性能的 HashMap)…...

java练习8.100m小球落地

题目: 如一个小球从100米高度自由落下&#xff0c;每次落地后就反跳回原高度的一半。 那么求它在第10次落地时&#xff0c;共经过多少米&#xff1f;第10次反弹多高&#xff1f; public static void main(String[] args) {/*假如一个小球从100米高度自由落下&#xff0c;每次落…...

Android JNI系列详解之生成指定CPU的库文件

一、前提 这次主要了解Android的cpu架构类型&#xff0c;以及在使用CMake工具的时候&#xff0c;如何指定生成哪种类型的库文件。 如上图所示&#xff0c;是我们之前使用CMake工具默认生成的四种cpu架构的动态库文件&#xff1a;arm64-v8a、armeabi-v7a、x86、x86_64&#xff0…...

Leetcode每日一题:1448. 统计二叉树中好节点的数目

原题 给你一棵根为 root 的二叉树&#xff0c;请你返回二叉树中好节点的数目。 「好节点」X 定义为&#xff1a;从根到该节点 X 所经过的节点中&#xff0c;没有任何节点的值大于 X 的值。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,3,null,1,5] 输出&#xff1a;4 解…...

华为OD七日集训第2期 - 按算法分类,由易到难,循序渐进,玩转OD(文末送书)

目录 一、适合人群二、本期训练时间三、如何参加四、7日集训第2期五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、逻辑分析第2天、字符串处理第3天、数据结构第4天、递归回溯第5天、二分查找第6天、深度优先搜索dfs算法第7天、动态规划 六、集训总结1、《代码…...

3d max插件CG MAGIC中的蜂窝材质功能可提升效率吗?

工作中能提升效率也都是大家所想的&#xff0c;对于设计师的一个设计过程中&#xff0c;可能想怎么样可以更快呀&#xff0c;是哪个步骤慢了呢&#xff1f; 这样的结果只能说会很多&#xff0c;但是建模这个步骤&#xff0c;肯定是有多无少的。 为了让模型更加逼真&#xff0c…...

一句话木马攻击复现:揭示黑客入侵的实战过程

这篇文章旨在用于网络安全学习&#xff0c;请勿进行任何非法行为&#xff0c;否则后果自负。 准备环境 OWASP虚拟机xfp 7与xshell 7 ​ DVWA系统默认的账号密码均为&#xff1a;admin/admin 1、命令注入中复现 ​ 攻击payload 127.0.0.1 | echo "<?php eval(…...

【游戏开发教程】Unity Cinemachine快速上手,详细案例讲解(虚拟相机系统 | 新发出品 | 良心教程)

文章目录 一、前言二、插件下载三、案例1&#xff1a;第三人称自由视角&#xff0c;Free Look character场景1、场景演示2、组件参数2.1、CinemachineBrain&#xff1a;核心2.2、CinemachineFreeLook&#xff1a;第三人称自由视角相机2.2.1、设置Follow&#xff1a;跟随2.2.2、…...

当图像宽高为奇数时,如何计算 I420 格式的uv分量大小

背景 I420 中 yuv 数据存放在3个 planes 中。 网上一般说 I420 数据大小为 widthheight1.5 但是当 width 和 height 是奇数时&#xff0c;这个计算公式会有问题。 I420 中 u 和 v 的宽高分别为 y 的一半。 但是当不能整除时&#xff0c;是如何取整呢&#xff1f;向上还是向下&…...

结构型模式-代理模式

代理模式* 定义&#xff1a;在代理模式&#xff08;Proxy Pattern&#xff09;中&#xff0c;一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中&#xff0c;我们创建具有现有对象的对象&#xff0c;以便向外界提供功能接口。 意图&#xff1a;为其…...