@@ -67,32 +67,110 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3100-3199/3152.Sp
67
67
68
68
<!-- solution:start -->
69
69
70
- ### 方法一
70
+ ### 方法一:记录每个位置的最左特殊数组位置
71
+
72
+ 我们可以定义一个数组 $d$ 来记录每个位置的最左特殊数组位置,初始时 $d[ i] = i$。然后我们从左到右遍历数组 $nums$,如果 $nums[ i] $ 和 $nums[ i - 1] $ 的奇偶性不同,那么 $d[ i] = d[ i - 1] $。
73
+
74
+ 最后我们遍历每个查询,判断 $d[ to] <= from$ 是否成立即可。
75
+
76
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是数组的长度。
71
77
72
78
<!-- tabs:start -->
73
79
74
80
#### Python3
75
81
76
82
``` python
77
-
83
+ class Solution :
84
+ def isArraySpecial (self , nums : List[int ], queries : List[List[int ]]) -> List[bool ]:
85
+ n = len (nums)
86
+ d = list (range (n))
87
+ for i in range (1 , n):
88
+ if nums[i] % 2 != nums[i - 1 ] % 2 :
89
+ d[i] = d[i - 1 ]
90
+ return [d[t] <= f for f, t in queries]
78
91
```
79
92
80
93
#### Java
81
94
82
95
``` java
83
-
96
+ class Solution {
97
+ public boolean [] isArraySpecial (int [] nums , int [][] queries ) {
98
+ int n = nums. length;
99
+ int [] d = new int [n];
100
+ for (int i = 1 ; i < n; ++ i) {
101
+ if (nums[i] % 2 != nums[i - 1 ] % 2 ) {
102
+ d[i] = d[i - 1 ];
103
+ } else {
104
+ d[i] = i;
105
+ }
106
+ }
107
+ int m = queries. length;
108
+ boolean [] ans = new boolean [m];
109
+ for (int i = 0 ; i < m; ++ i) {
110
+ ans[i] = d[queries[i][1 ]] <= queries[i][0 ];
111
+ }
112
+ return ans;
113
+ }
114
+ }
84
115
```
85
116
86
117
#### C++
87
118
88
119
``` cpp
89
-
120
+ class Solution {
121
+ public:
122
+ vector<bool > isArraySpecial(vector<int >& nums, vector<vector<int >>& queries) {
123
+ int n = nums.size();
124
+ vector<int > d(n);
125
+ iota(d.begin(), d.end(), 0);
126
+ for (int i = 1; i < n; ++i) {
127
+ if (nums[ i] % 2 != nums[ i - 1] % 2) {
128
+ d[ i] = d[ i - 1] ;
129
+ }
130
+ }
131
+ vector<bool > ans;
132
+ for (auto& q : queries) {
133
+ ans.push_back(d[ q[ 1]] <= q[ 0] );
134
+ }
135
+ return ans;
136
+ }
137
+ };
90
138
```
91
139
92
140
#### Go
93
141
94
142
```go
143
+ func isArraySpecial(nums []int, queries [][]int) (ans []bool) {
144
+ n := len(nums)
145
+ d := make([]int, n)
146
+ for i := range d {
147
+ d[i] = i
148
+ }
149
+ for i := 1; i < len(nums); i++ {
150
+ if nums[i]%2 != nums[i-1]%2 {
151
+ d[i] = d[i-1]
152
+ }
153
+ }
154
+ for _, q := range queries {
155
+ ans = append(ans, d[q[1]] <= q[0])
156
+ }
157
+ return
158
+ }
159
+ ```
95
160
161
+ #### TypeScript
162
+
163
+ ``` ts
164
+ function isArraySpecial(nums : number [], queries : number [][]): boolean [] {
165
+ const n = nums .length ;
166
+ const d: number [] = Array .from ({ length: n }, (_ , i ) => i );
167
+ for (let i = 1 ; i < n ; ++ i ) {
168
+ if (nums [i ] % 2 !== nums [i - 1 ] % 2 ) {
169
+ d [i ] = d [i - 1 ];
170
+ }
171
+ }
172
+ return queries .map (([from , to ]) => d [to ] <= from );
173
+ }
96
174
```
97
175
98
176
<!-- tabs: end -->
0 commit comments