【LeetCode 每日一题】3021. Alice 和 Bob 玩鲜花游戏
Problem: 3021. Alice 和 Bob 玩鲜花游戏
文章目录
- 整体思路
- 完整代码
- 时空复杂度
- 时间复杂度:O(1)
- 空间复杂度:O(1)
整体思路
该算法的思路非常直接,是一种纯粹的 数学组合分析 方法,而非模拟或搜索。
-
问题抽象:
- 将问题从具体的游戏场景抽象为:在两个整数集合
{1, 2, ..., n}
和{1, 2, ..., m}
中,分别取一个数p
和q
,求满足p
和q
奇偶性不同(即p
奇q
偶,或p
偶q
奇)的数对(p, q)
的总数量。 - 为什么是奇偶性?
p + q
为奇数时,先手(或某个特定玩家)获胜。p + q
为奇数的充要条件是p
和q
一个是奇数,一个是偶数。
- 将问题从具体的游戏场景抽象为:在两个整数集合
-
分类计数:
- 算法首先将两个数字范围内的数按奇偶性进行分类计数。
- 对于范围
[1, n]
:- 偶数个数
evenP
:通过整除n / 2
计算。 - 奇数个数
oddP
:通过总数n
减去偶数个数n - evenP
计算。
- 偶数个数
- 对于范围
[1, m]
:- 偶数个数
evenQ
:通过整除m / 2
计算。 - 奇数个数
oddQ
:通过总数m
减去偶数个数m - evenQ
计算。
- 偶数个数
-
应用乘法原理:
- 问题现在分解为两个互斥的情况:
a. 情况一:玩家 P 选偶数,玩家 Q 选奇数。- P 选偶数有
evenP
种选择。 - Q 选奇数有
oddQ
种选择。 - 根据乘法原理,这种情况下的组合总数为
evenP * oddQ
。
b. 情况二:玩家 P 选奇数,玩家 Q 选偶数。 - P 选奇数有
oddP
种选择。 - Q 选偶数有
evenQ
种选择。 - 根据乘法原理,这种情况下的组合总数为
oddP * evenQ
。
- P 选偶数有
- 问题现在分解为两个互斥的情况:
-
应用加法原理:
- 最终的总有效组合数是上述两种互斥情况的总和。
- 因此,最终结果为
evenP * oddQ + oddP * evenQ
。
-
数据类型:
- 代码使用了
long
类型来存储计数结果和最终答案,这是一个很好的实践,可以防止当n
和m
较大时,乘积结果超出int
的表示范围而导致的溢出问题。
- 代码使用了
完整代码
class Solution {/*** 计算一个组合游戏中的有效组合数。* 问题背景:两个玩家分别从 [1, n] 和 [1, m] 中选择一个数字。* 获胜条件(或有效组合)是两个数字之和为奇数。* @param n 第一个数字范围的上限* @param m 第二个数字范围的上限* @return 有效组合的总数*/public long flowerGame(int n, int m) {// 计算范围 [1, n] 中偶数和奇数的个数// 偶数个数可以直接通过整除得到long evenP = n / 2;// 奇数个数等于总数减去偶数个数long oddP = n - evenP;// 计算范围 [1, m] 中偶数和奇数的个数long evenQ = m / 2;long oddQ = m - evenQ;// 应用组合数学的乘法原理和加法原理// 总的有效组合数 = (n中的偶数 * m中的奇数) + (m中的偶数 * n中的奇数)// 这是因为只有 "偶+奇" 或 "奇+偶" 的结果才是奇数。return evenP * oddQ + evenQ * oddP;}
}
时空复杂度
时间复杂度:O(1)
- 操作分析:
- 代码中执行的所有操作都是基本的算术运算:两次除法、两次减法、两次乘法和一次加法。
- 这些操作的执行时间是固定的,不依赖于输入
n
和m
的大小。
综合分析:
算法的执行时间是一个常数。因此,其时间复杂度为 O(1)。
空间复杂度:O(1)
- 存储分析:
- 算法在执行过程中只使用了几个
long
类型的变量(evenP
,oddP
,evenQ
,oddQ
)来存储中间计算结果。 - 这些变量的数量是固定的,不随输入
n
和m
的大小而改变。
- 算法在执行过程中只使用了几个
综合分析:
算法没有使用任何与输入规模成比例的额外数据结构。因此,其额外辅助空间复杂度为 O(1)。