Easy

题目描述

如果数组中每一对相邻元素的奇偶性都不相同,则该数组被认为是特殊的。换句话说,每对相邻元素中,一个必须是偶数,另一个必须是奇数。

给你一个整数数组 nums。如果 nums 是特殊数组,返回 true,否则返回 false

示例 1:

输入:nums = [1]
输出:true
解释:
只有一个元素,所以答案是 true。

示例 2:

输入:nums = [2,1,4]
输出:true
解释:
只有两对相邻元素:(2,1) 和 (1,4),它们都包含不同奇偶性的数字。所以答案是 true。

示例 3:

输入:nums = [4,3,1,6]
输出:false
解释:
nums[1] 和 nums[2] 都是奇数。所以答案是 false。

约束条件:

  • 1 <= nums.length <= 100
  • 1 <= nums[i] <= 100

提示:

  • 尝试检查每个元素和其前一个元素的奇偶性。

解题思路

这道题要求检查数组中相邻元素的奇偶性是否不同。我们可以从多个角度来解决:

解法思路

1. 直接遍历法(推荐)

最直接的方法是遍历数组,检查每对相邻元素的奇偶性。对于每个位置 i(从 1 开始),检查 nums[i]nums[i-1] 的奇偶性是否不同。

判断两个数奇偶性是否不同的方法:

  • 方法一:(a % 2) != (b % 2)
  • 方法二:(a + b) % 2 == 1(奇数+偶数=奇数)
  • 方法三:(a ^ b) & 1 == 1(位运算,异或后最低位为1)

2. 特殊情况处理

当数组长度为 1 时,没有相邻元素,直接返回 true

3. 优化考虑

由于数组长度最大为 100,性能优化不是重点,代码清晰度更重要。使用最直观的模运算方法即可。

时间复杂度为 O(n),空间复杂度为 O(1),是最优解法。

代码实现

class Solution {
public:
    bool isArraySpecial(vector<int>& nums) {
        for (int i = 1; i < nums.size(); i++) {
            if (nums[i] % 2 == nums[i-1] % 2) {
                return false;
            }
        }
        return true;
    }
};
class Solution:
    def isArraySpecial(self, nums: List[int]) -> bool:
        for i in range(1, len(nums)):
            if nums[i] % 2 == nums[i-1] % 2:
                return False
        return True
public class Solution {
    public bool IsArraySpecial(int[] nums) {
        for (int i = 1; i < nums.Length; i++) {
            if (nums[i] % 2 == nums[i-1] % 2) {
                return false;
            }
        }
        return true;
    }
}
var isArraySpecial = function(nums) {
    for (let i = 0; i < nums.length - 1; i++) {
        if (nums[i] % 2 === nums[i + 1] % 2) {
            return false;
        }
    }
    return true;
};

复杂度分析

复杂度类型复杂度
时间复杂度O(n)
空间复杂度O(1)

其中 n 是数组 nums 的长度。我们只需要遍历数组一次,每次操作都是常数时间,因此时间复杂度为 O(n)。我们只使用了常数个额外变量,空间复杂度为 O(1)。