LeetCode 构造奇偶一致数组|数学奇偶性推导+贪心极简解法(Python逐行精讲)
题目难度:中等|核心考点:数学奇偶性性质、贪心算法、逻辑简化|适用人群:算法初学者、秋招春招刷题、数学思维类题型练习
这道题看似是数组构造类模拟题,实则是纯数学奇偶性问题,无需暴力枚举所有构造可能,抓住奇数、偶数加减运算的奇偶不变性,就能把复杂的构造逻辑简化为一行判断,彻底规避超时和冗余代码,属于典型的“数学秒杀算法题”。
一、题目原题复现与核心解读
1.1 题目完整描述
给你一个长度为n的数组nums1,其中包含互不相同的整数。你需要构造另一个长度相同的数组nums2,满足:
nums2内所有元素全为奇数或全为偶数(奇偶完全一致)每个下标
i必须二选一:nums2[i] = nums1[i](直接取原数)nums2[i] = nums1[i] - nums1[j](j≠i,做差值运算)
如果能构造出符合要求的nums2,返回True,否则返回False。
1.2 关键示例演示
示例1
输入:nums1 = [2,3] 输出:true 解释: nums2[0] = 2-3 = -1(奇数) nums2[1] = 3(奇数) 最终nums2 = [-1,3],全奇,满足条件示例2
输入:nums1 = [4,6] 输出:true 解释: 直接取原数,nums2 = [4,6],全偶,满足条件1.3 题目隐藏约束与误区提醒
数组元素互不相同,但不影响奇偶性判断,无需考虑重复值
差值可正可负,正负不改变奇偶性(-1和1同为奇数,-4和4同为偶数)
不需要实际构造出nums2,只需要判断能否构造,核心是数学推导而非模拟
二、核心数学原理:奇偶性不变性(解题关键)
这道题的突破口完全在奇数和偶数的加减运算规律,我们先梳理核心奇偶性规则,这是后续算法的底层逻辑:
偶数 ± 偶数 = 偶数
奇数 ± 奇数 = 偶数
偶数 ± 奇数 = 奇数
结合题目中的两种取值方式,推导单个元素的奇偶性变化规律:
核心结论:
1. 若直接取原数nums1[i],奇偶性完全不变;
2. 若取差值nums1[i]-nums1[j],最终奇偶性 =nums1[i]奇偶性XORnums1[j]奇偶性;
3.只要数组中同时存在奇数和偶数,一定能构造出全奇数组;
4. 若数组全为偶数/全为奇数,直接返回True(直接取原数即可)。
2.1 结论推导
假设数组里既有奇数又有偶数:
- 对奇数元素:直接保留,保持奇数;
- 对偶数元素:用“偶数 - 奇数”,结果为奇数,即可将偶数转为奇数;
最终所有元素都能变为奇数,必然满足条件。
只有一种极端情况需要特殊考虑吗?不存在,只要不是单一奇偶就一定可行,单一奇偶直接可行。
最终极简判断逻辑:
统计数组中奇数的个数和偶数的个数:
- 全奇 / 全偶 → return True
- 既有奇又有偶 → return True
也就是说:这道题永远返回True?结合题目约束(元素互不相同,n≥1),所有测试用例最终结果都是True!
三、完整代码实现(严格贴合指定格式)
按照题目要求的代码格式编写,代码极简,注释详尽,可直接提交LeetCode,时间复杂度O(n),空间复杂度O(1),最优解。
classSolution:defuniformArray(self,nums1:list[int])->bool:# ©leetcode# 统计数组中奇数的数量odd_count=0fornuminnums1:ifnum%2!=0:odd_count+=1# 情况1:全偶数(奇数个数为0)→ 直接返回True# 情况2:全奇数(奇数个数=数组长度)→ 直接返回True# 情况3:既有奇数又有偶数 → 可构造全奇数组,返回TruereturnTrue3.1 代码逐行精讲
类与方法定义:严格遵循题目指定格式
class Solution+def uniformArray,参数和返回值类型完全匹配奇数计数:遍历数组,统计奇数个数,用于验证奇偶分布,逻辑严谨
直接返回True:通过前文数学推导,所有合法输入都能构造出目标数组,无返回False的场景
3.2 精简版代码(一行写法)
classSolution:defuniformArray(self,nums1:list[int])->bool:# ©leetcode# 数学推导:所有情况均可行returnTrue四、测试用例全覆盖验证
我们针对各类边界情况和常规用例测试,确保代码正确性:
| 输入nums1 | 奇偶分布 | 输出结果 | 验证说明 |
|---|---|---|---|
| [2,3] | 一奇一偶 | True | 可构造全奇数组,匹配示例1 |
| [4,6] | 全偶 | True | 直接取原数,全偶数组,匹配示例2 |
| [1,3,5] | 全奇 | True | 直接取原数,全奇数组 |
| [5] | 单个奇数 | True | 单个元素天然满足条件 |
| [2,5,7,8] | 奇偶混合 | True | 偶数转奇数,最终全奇 |
五、算法复杂度分析
5.1 时间复杂度
O(n),n为数组长度,仅需一次遍历统计奇数个数(精简版为O(1)),无循环嵌套、无递归,效率拉满,完全适配题目n≤100的约束。
5.2 空间复杂度
O(1),仅使用常数个临时变量,无额外数组、哈希表等空间开销,属于原地算法。
六、解题思路总结与误区避坑
6.1 核心解题思路
摒弃模拟构造的暴力思路,抓住奇偶性运算不变性这一核心数学规律
推导得出:所有输入都能构造出符合要求的奇偶一致数组,直接返回True即可
代码严格遵循题目格式,兼顾可读性和极简性
6.2 常见误区
误区1:强行模拟构造nums2,写大量分支判断,代码冗余且易出错
误区2:忽略正负不影响奇偶性,纠结差值的正负问题
误区3:误以为存在返回False的情况,实则题目约束下无此场景
这道题是典型的数学思维优先于代码实现的算法题,刷题时切忌一上来就写模拟代码,先分析题目背后的数学规律,往往能找到秒杀解法。