3152. 特殊数组 IIhttps://leetcode.cn/problems/special-array-ii/
目录
前缀和
考虑一下:给你一个只包含 0 和 1 的数组,如何快速判断一个子数组是否全为 0?
解答:如果子数组的元素和等于 0,那么子数组一定全为 0;如果子数组的元素和大于 0,那么子数组一定包含 1。如何快速计算子数组元素和?这可以用 前缀和 解决。
对于本题,定义长为 n−1 的数组 a,其中
如果 a 的下标从 from 到 to−1 的子数组和等于 0,就说明 nums 的下标从 from 到 to 的这个子数组,其所有相邻元素的奇偶性都不同,该子数组为特殊数组。
计算 a 的前缀和 s,可以快速判断子数组和是否为 0,也就是判断
即:
题目
如果数组的每一对相邻元素都是两个奇偶性不同的数字,则该数组被认为是一个 特殊数组 。
周洋哥有一个整数数组 nums
和一个二维整数矩阵 queries
,对于 queries[i] = [fromi, toi]
,请你帮助周洋哥检查子数组 nums[fromi..toi]
是不是一个 特殊数组 。
返回布尔数组 answer
,如果 nums[fromi..toi]
是特殊数组,则 answer[i]
为 true
,否则,answer[i]
为 false
。
示例 1:
输入:nums = [3,4,1,2,6], queries = [[0,4]]
输出:[false]
解释:
子数组是 [3,4,1,2,6]
。2 和 6 都是偶数。
示例 2:
输入:nums = [4,3,1,6], queries = [[0,2],[2,3]]
输出:[false,true]
解释:
- 子数组是
[4,3,1]
。3 和 1 都是奇数。因此这个查询的答案是false
。 - 子数组是
[1,6]
。只有一对:(1,6)
,且包含了奇偶性不同的数字。因此这个查询的答案是true
。
提示:
1 <= nums.length <= 105
1 <= nums[i] <= 105
1 <= queries.length <= 105
queries[i].length == 2
0 <= queries[i][0] <= queries[i][1] <= nums.length - 1
Code:
public boolean[] isArraySpecial(int[] nums, int[][] queries) {
int[] s = new int[nums.length];
//创建相同长度的数组,用于存储前缀和
for (int i = 1; i < nums.length; i++) {
s[i] = s[i - 1] + (nums[i - 1] % 2 == nums[i] % 2 ? 1 : 0);
//三目运算符,若相邻元素的奇偶性相同,则前缀和加1
}
boolean[] ans = new boolean[queries.length];
//创建二维数组相同长度的boolean数组,用于存储结果
for (int i = 0; i < queries.length; i++) {
int[] q = queries[i];
//获取每次前缀和区间的边界
ans[i] = s[q[0]] == s[q[1]];
//若前缀和区间边界值相等,则边界内相邻元素的奇偶性都不相同
}
return ans;
}