题目:
如果数组的每一对相邻元素都是两个奇偶性不同的数字,则该数组被认为是一个 特殊数组 。
你有一个整数数组 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:如果两个数奇偶性不同,则两数之和为奇数。
知识储备2:如果一组数之和为奇数,则其中奇数和偶数个数不相等。
知识储备3:如果一组数之和为偶数,则其中奇数和偶数个数相同。
知识储备4:一个数与 1 做 与 运算 结果为0 则这个数为偶数,反之为奇数。
解题思路:
新建一个与nums等长的数组 change,change[0]初始化为0,change[i]代表在nums中从0号元素到 i 号元素奇偶性变化的次数。
例如:
nums = [1,2,3,4,5,6] -----> change = [0,1,2,3,4,5]
nums = [1,2,3,3,4,5] -----> change = [0,1,2,2,3,4]
第二个实力中 3到3 奇偶性未发生变化 所以change[2]、change[3]的值均为2
判断
若要判定子数组 from–to 是否为特殊数组,条件为 change[to]-change[from] == to-from 即可
对于实例:nums = [1,2,3,3,4,5] -----> change = [0,1,2,2,3,4]
from=0 to=2 时 子数组为[1,2,3] 此时change[2]-change[0]=2-0=2与to-from值相等,返回true;
from=1 to=3 时 子数组为[2,3,3] 此时change[3]-change[1]=2-1=1与to-from值不相等,返回false;
逻辑理顺,上代码:
public static boolean[] isArraySpecial(int[] nums, int[][] queries) {
boolean[] res = new boolean[queries.length];
int[] change = new int[nums.length];
int sum = 0;
for (int i = 0; i < nums.length-1; i++) {
change[i] = sum;
if(((nums[i]+ nums[i+1]) & 1) != 0){
sum++;
}
}
change[change.length-1] = sum;
for (int i = 0; i < queries.length; i++) {
int form = queries[i][0];
int to = queries[i][1];
if(change[to]-change[form] == to-form){
res[i] = true;
}else {
res[i] = false;
}
}
return res;
}