
2026-07-11:构造奇偶一致的数组Ⅱ。用go语言,给定一个长度为 n 的整数数组 nums1,所有元素互不相同。需要构造一个同样长度为 n 的数组 nums2,使得 nums2 的每个元素都必须是奇数或者都必须是偶数(只能二选一)。对每个下标 i,nums2[i] 只能用两种方式之一生成:要么直接取 nums2[i] 等于 nums1[i];要么选择某个不同下标 j,把 nums2[i] 设为 nums1[i] 减去 nums1[j],并且要求这个差值为正(即 nums1[i] - nums1[j] >= 1)。如果能找到某种构造使得 nums2 全为奇数或全为偶数则返回 true,否则返回 false。
1 <= n == nums1.length <= 100000。
1 <= nums1[i] <= 1000000000。
nums1 中的所有整数互不相同。
输入: nums1 = [1,4,7]。
输出: true。
解释:
设置 nums2[0] = nums1[0] = 1。
设置 nums2[1] = nums1[1] - nums1[0] = 4 - 1 = 3。
设置 nums2[2] = nums1[2] = 7。
nums2 = [1, 3, 7],所有元素均为奇数。因此答案为 true。
题目来自力扣3876。
对任意下标 i:
nums2[i] = nums1[i],直接复用原数;nums1[i] - nums1[j] ≥ 1,令 nums2[i] = nums1[i] - nums1[j];
最终要求整个 nums2 全部奇数 或 全部偶数,满足其一就返回 true。设 a、b 为整数:
目标1:构造全奇数 nums2 目标2:构造全偶数 nums2 只要其中一种目标存在可行构造,答案就是 true。
mn[0] 存最小偶数、mn[1] 存最小奇数,初始值设为系统最大整数(代表当前还没找到对应类型数字);x & 1 判断奇偶:结果0=偶数、结果1=奇数;mn[0]:数组里所有偶数的最小值;若无偶数,保持最大值;mn[1]:数组里所有奇数的最小值;若无奇数,保持最大值。此时直接满足函数返回条件 mn[1] == math.MaxInt,直接返回 true。
原理:每个位置i都选择方案A(直接取原偶数),nums2 全偶数,天然合法。
此时 mn[0] > mn[1] 恒成立(极大值一定大于奇数最小值),满足第二个判断条件,返回 true。
原理:每个位置i直接取原奇数,nums2 全奇数,天然合法。
此时判断条件:最小偶数 > 最小奇数(mn[0] > mn[1]),分两种子情况:
以示例 [1,4,7] 举例:
最小奇数 mn[1]=1,最小偶数 mn[0]=4,4>1,符合条件。
推导为什么能构造全奇数nums2:
x - min_odd ≥ 1;根据奇偶规律,偶数−奇数=奇数,因此选方案B,用j对应min_odd的下标,差值就是奇数;此时全局最小数字是偶数 min_even,数组同时有奇数、偶数,无法构造全奇数/全偶数数组:
函数判断式 mn[1] == math.MaxInt || mn[0] > mn[1] 等价于:
要么数组无奇数(全偶数直接合法),要么最小偶数大于最小奇数(可以构造全奇数数组),满足任意一条就返回true,其余情况返回false。
仅开辟固定长度数组 mn [2]int,只存储两个整数,空间大小与输入数组长度 n 无关,属于常量空间;
没有开辟动态切片、哈希表、辅助数组等随n增长的空间;
总额外空间复杂度:O(1)(常数空间)。
.
package main
import (
"fmt"
"math"
)
func uniformArray(nums1 []int)bool {
// 计算最小偶数、最小奇数
mn := [2]int{math.MaxInt, math.MaxInt}
for _, x := range nums1 {
mn[x&1] = min(mn[x&1], x) // &1 比 %2 好,nums1 有负数也适用
}
// 只有偶数,或者偶数 >= 最小的偶数 > 最小的奇数
// 只有奇数的情况蕴含在 mn[0] > mn[1] 中
return mn[1] == math.MaxInt || mn[0] > mn[1]
}
func main() {
nums1 := []int{1, 4, 7}
result := uniformArray(nums1)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
import math
from typing import List
def uniform_array(nums: List[int]) -> bool:
# 计算最小偶数、最小奇数
mn = [math.inf, math.inf]
for x in nums:
# & 1 比 % 2 更好,nums 有负数也适用
mn[x & 1] = min(mn[x & 1], x)
# 只有偶数,或者偶数 >= 最小的偶数 > 最小的奇数
# 只有奇数的情况蕴含在 mn[0] > mn[1] 中
return mn[1] == math.inf or mn[0] > mn[1]
def main():
nums = [1, 4, 7]
result = uniform_array(nums)
print(result)
if __name__ == "__main__":
main()
.
#include <iostream>
#include <vector>
#include <climits>
#include <algorithm>
bool uniformArray(const std::vector<int>& nums) {
// 计算最小偶数、最小奇数
int mn[2] = {INT_MAX, INT_MAX};
for (int x : nums) {
// & 1 比 % 2 更好,nums 有负数也适用
mn[x & 1] = std::min(mn[x & 1], x);
}
// 只有偶数,或者偶数 >= 最小的偶数 > 最小的奇数
// 只有奇数的情况蕴含在 mn[0] > mn[1] 中
return mn[1] == INT_MAX || mn[0] > mn[1];
}
int main() {
std::vector<int> nums = {1, 4, 7};
bool result = uniformArray(nums);
std::cout << std::boolalpha << result << std::endl;
return0;
}

·
我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。
·