Skip to content

3152. Special Array II

Description

An array is considered special if every pair of its adjacent elements contains two numbers with different parity.

You are given an array of integer nums and a 2D integer matrix queries, where for queries[i] = [fromi, toi] your task is to check that

nums[fromi..toi] is special or not.

Return an array of booleans answer such that answer[i] is true if nums[fromi..toi] is special.

 

Example 1:

Input: nums = [3,4,1,2,6], queries = [[0,4]]

Output: [false]

Explanation:

The subarray is [3,4,1,2,6]. 2 and 6 are both even.

Example 2:

Input: nums = [4,3,1,6], queries = [[0,2],[2,3]]

Output: [false,true]

Explanation:

  1. The subarray is [4,3,1]. 3 and 1 are both odd. So the answer to this query is false.
  2. The subarray is [1,6]. There is only one pair: (1,6) and it contains numbers with different parity. So the answer to this query is true.

 

Constraints:

  • 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

 

Solutions

Solution: Prefix Sum

  • Time complexity: O(n + queries.length)
  • Space complexity: O(n + queries.length)

 

JavaScript

js
/**
 * @param {number[]} nums
 * @param {number[][]} queries
 * @return {boolean[]}
 */
const isArraySpecial = function (nums, queries) {
  const n = nums.length;
  const specials = Array.from({ length: n }, () => 1);

  for (let index = 1; index < n; index++) {
    const isSpecial = nums[index] % 2 !== nums[index - 1] % 2;

    specials[index] = isSpecial ? specials[index - 1] + 1 : 1;
  }

  return queries.map(([from, to]) => {
    const length = to - from + 1;

    return length === specials[to] - specials[from] + 1;
  });
};

Released under the MIT license