如果数组的每一对相邻元素都是两个奇偶性不同的数字,则该数组被认为是一个 特殊数组 。
你有一个整数数组 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
问题简要描述:判断数组是否特殊数组
细节阐述:
- 数组 d 来记录每个位置的最左特殊数组位置
Java
class Solution {
public boolean[] isArraySpecial(int[] nums, int[][] queries) {
int n = nums.length;
int[] d = new int[n];
for (int i = 1; i < n; i++) {
if (nums[i] % 2 != nums[i - 1] % 2) {
d[i] = d[i - 1];
} else {
d[i] = i;
}
}
int m = queries.length;
boolean[] ans = new boolean[m];
for (int i = 0; i < m; i++) {
ans[i] = d[queries[i][1]] <= queries[i][0];
}
return ans;
}
}
Python3
class Solution:
def isArraySpecial(self, nums: List[int], queries: List[List[int]]) -> List[bool]:
n = len(nums)
d = list(range(n))
for i in range(1, n):
if nums[i] % 2 != nums[i - 1] % 2:
d[i] = d[i - 1]
return [d[t] <= f for f, t in queries]
TypeScript
function isArraySpecial(nums: number[], queries: number[][]): boolean[] {
const n = nums.length;
let d = Array.from({length: n}, (_, i) => i);
for (let i = 1; i < n; i++) {
if (nums[i] % 2 != nums[i - 1] % 2) {
d[i] = d[i - 1];
}
}
return queries.map(([f, t]) => d[t] <= f);
};
C++
class Solution {
public:
vector<bool> isArraySpecial(vector<int>& nums, vector<vector<int>>& queries) {
int n = nums.size();
vector<int> d(n);
iota(d.begin(), d.end(), 0);
for (int i = 1;i < n;i++) {
if (nums[i] % 2 != nums[i - 1] % 2) {
d[i] = d[i - 1];
}
}
int m = queries.size();
vector<bool> ans(m);
for (int i = 0;i < m;i++) {
ans[i] = d[queries[i][1]] <= d[queries[i][0]];
}
return ans;
}
};
Go
func isArraySpecial(nums []int, queries [][]int) []bool {
n := len(nums)
d := make([]int, n)
for i := 1; i < n; i++ {
if nums[i]%2 != nums[i-1]%2 {
d[i] = d[i-1]
} else {
d[i] = i
}
}
m := len(queries)
ans := make([]bool, m)
for i := 0; i < m; i++ {
ans[i] = d[queries[i][1]] <= queries[i][0]
}
return ans
}