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 <= 1001 <= 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)。