|
| 1 | +#### 3152. 特殊数组 II |
| 2 | + |
| 3 | +难度:中等 |
| 4 | + |
| 5 | +--- |
| 6 | + |
| 7 | +如果数组的每一对相邻元素都是两个奇偶性不同的数字,则该数组被认为是一个 **特殊数组** 。 |
| 8 | + |
| 9 | +周洋哥有一个整数数组 `nums` 和一个二维整数矩阵 `queries`,对于 `queries[i] = [fromi, toi]`,请你帮助周洋哥检查子数组 `nums[fromi..toi]` 是不是一个 **特殊数组** 。 |
| 10 | + |
| 11 | +返回布尔数组 `answer`,如果 `nums[fromi..toi]` 是特殊数组,则 `answer[i]` 为 `true` ,否则,`answer[i]` 为 `false` 。 |
| 12 | + |
| 13 | + **示例 1:** |
| 14 | + |
| 15 | + **输入:** nums = \[3,4,1,2,6\], queries = \[\[0,4\]\] |
| 16 | + |
| 17 | + **输出:** \[false\] |
| 18 | + |
| 19 | + **解释:** |
| 20 | + |
| 21 | +子数组是 `[3,4,1,2,6]`。2 和 6 都是偶数。 |
| 22 | + |
| 23 | + **示例 2:** |
| 24 | + |
| 25 | + **输入:** nums = \[4,3,1,6\], queries = \[\[0,2\],\[2,3\]\] |
| 26 | + |
| 27 | + **输出:** \[false,true\] |
| 28 | + |
| 29 | + **解释:** |
| 30 | + |
| 31 | +1. 子数组是 `[4,3,1]`。3 和 1 都是奇数。因此这个查询的答案是 `false`。 |
| 32 | +2. 子数组是 `[1,6]`。只有一对:`(1,6)`,且包含了奇偶性不同的数字。因此这个查询的答案是 `true`。 |
| 33 | + |
| 34 | + **提示:** |
| 35 | + |
| 36 | +* `1 <= nums.length <= 10^5` |
| 37 | +* `1 <= nums[i] <= 10^5` |
| 38 | +* `1 <= queries.length <= 10^5` |
| 39 | +* `queries[i].length == 2` |
| 40 | +* `0 <= queries[i][0] <= queries[i][1] <= nums.length - 1` |
| 41 | + |
| 42 | +--- |
| 43 | + |
| 44 | +动态规划: |
| 45 | + |
| 46 | +一维数组 `dp[i]` 表示下标 `i` 的数是特殊数组的第几个数。例如 `[3,4,1,2,6]` 所对应的 `dp[i]` 分别是 `[1, 2, 3, 4, 1]`,前四个数为一组特殊数组,最后一个数单独构成一组特殊数组。然后根据给定的区间和当前下标的值进行比较。 |
| 47 | + |
| 48 | +```Go |
| 49 | +func isArraySpecial(nums []int, queries [][]int) []bool { |
| 50 | + n := len(nums) |
| 51 | + dp := make([]int, n) |
| 52 | + dp[0] = 1 |
| 53 | + for i := 1; i < n; i++ { |
| 54 | + dp[i] = 1 |
| 55 | + if ((nums[i] ^ nums[i - 1]) & 1 == 1) { |
| 56 | + dp[i] = dp[i - 1] + 1 |
| 57 | + } |
| 58 | + } |
| 59 | + res := []bool{} |
| 60 | + for i := range queries { |
| 61 | + gap := queries[i][1] - queries[i][0] |
| 62 | + res = append(res, dp[queries[i][1]] >= gap + 1) |
| 63 | + } |
| 64 | + return res |
| 65 | +} |
| 66 | +``` |
0 commit comments