|
26 | 26 |
|
27 | 27 | <pre>
|
28 | 28 | <strong>输入: </strong><em>nums</em> = <code>[1,-1,5,-2,3]</code>, <em>k</em> = <code>3</code>
|
29 |
| -<strong>输出: </strong>4 |
| 29 | +<strong>输出: </strong>4 |
30 | 30 | <strong>解释: </strong>子数组 <code>[1, -1, 5, -2]</code> 和等于 3,且长度最长。
|
31 | 31 | </pre>
|
32 | 32 |
|
@@ -55,13 +55,13 @@ tags:
|
55 | 55 |
|
56 | 56 | ### 方法一:哈希表 + 前缀和
|
57 | 57 |
|
58 |
| -我们可以用一个哈希表 $d$ 记录数组 $nums$ 中每个前缀和第一次出现的下标,初始时 $d[0] = -1$。另外定义一个变量 $s$ 记录前缀和。 |
| 58 | +我们可以用一个哈希表 $\textit{d}$ 记录数组 $\textit{nums}$ 中每个前缀和第一次出现的下标,初始时 $\textit{d}[0] = -1$。另外定义一个变量 $\textit{s}$ 记录前缀和。 |
59 | 59 |
|
60 |
| -接下来,遍历数组 $nums$,对于当前遍历到的数字 $nums[i]$,我们更新前缀和 $s = s + nums[i]$,如果 $s-k$ 在哈希表 $d$ 中存在,不妨记 $j = d[s - k]$,那么以 $nums[i]$ 结尾的符合条件的子数组的长度为 $i - j$,我们使用一个变量 $ans$ 来维护最长的符合条件的子数组的长度。然后,如果 $s$ 在哈希表中不存在,我们记录 $s$ 和对应的下标 $i$,即 $d[s] = i$,否则我们不更新 $d[s]$。需要注意的是,可能会有多个位置 $i$ 都满足 $s$ 的值,因此我们只记录最小的 $i$,这样就能保证子数组的长度最长。 |
| 60 | +接下来,遍历数组 $\textit{nums}$,对于当前遍历到的数字 $\textit{nums}[i]$,我们更新前缀和 $\textit{s} = \textit{s} + \textit{nums}[i]$,如果 $\textit{s}-k$ 在哈希表 $\textit{d}$ 中存在,不妨记 $j = \textit{d}[\textit{s} - k]$,那么以 $\textit{nums}[i]$ 结尾的符合条件的子数组的长度为 $i - j$,我们使用一个变量 $\textit{ans}$ 来维护最长的符合条件的子数组的长度。然后,如果 $\textit{s}$ 在哈希表中不存在,我们记录 $\textit{s}$ 和对应的下标 $i$,即 $\textit{d}[\textit{s}] = i$,否则我们不更新 $\textit{d}[\textit{s}]$。需要注意的是,可能会有多个位置 $i$ 都满足 $\textit{s}$ 的值,因此我们只记录最小的 $i$,这样就能保证子数组的长度最长。 |
61 | 61 |
|
62 |
| -遍历结束之后,我们返回 $ans$ 即可。 |
| 62 | +遍历结束之后,我们返回 $\textit{ans}$ 即可。 |
63 | 63 |
|
64 |
| -时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是数组 $nums$ 的长度。 |
| 64 | +时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是数组 $\textit{nums}$ 的长度。 |
65 | 65 |
|
66 | 66 | <!-- tabs:start -->
|
67 | 67 |
|
@@ -163,6 +163,80 @@ function maxSubArrayLen(nums: number[], k: number): number {
|
163 | 163 | }
|
164 | 164 | ```
|
165 | 165 |
|
| 166 | +#### Rust |
| 167 | + |
| 168 | +```rust |
| 169 | +use std::collections::HashMap; |
| 170 | + |
| 171 | +impl Solution { |
| 172 | + pub fn max_sub_array_len(nums: Vec<i32>, k: i32) -> i32 { |
| 173 | + let mut d = HashMap::new(); |
| 174 | + d.insert(0, -1); |
| 175 | + let mut ans = 0; |
| 176 | + let mut s = 0; |
| 177 | + |
| 178 | + for (i, &x) in nums.iter().enumerate() { |
| 179 | + s += x; |
| 180 | + if let Some(&j) = d.get(&(s - k)) { |
| 181 | + ans = ans.max((i as i32) - j); |
| 182 | + } |
| 183 | + d.entry(s).or_insert(i as i32); |
| 184 | + } |
| 185 | + |
| 186 | + ans |
| 187 | + } |
| 188 | +} |
| 189 | +``` |
| 190 | + |
| 191 | +#### JavaScript |
| 192 | + |
| 193 | +```js |
| 194 | +/** |
| 195 | + * @param {number[]} nums |
| 196 | + * @param {number} k |
| 197 | + * @return {number} |
| 198 | + */ |
| 199 | +var maxSubArrayLen = function (nums, k) { |
| 200 | + const d = new Map(); |
| 201 | + d.set(0, -1); |
| 202 | + let ans = 0; |
| 203 | + let s = 0; |
| 204 | + for (let i = 0; i < nums.length; ++i) { |
| 205 | + s += nums[i]; |
| 206 | + if (d.has(s - k)) { |
| 207 | + ans = Math.max(ans, i - d.get(s - k)); |
| 208 | + } |
| 209 | + if (!d.has(s)) { |
| 210 | + d.set(s, i); |
| 211 | + } |
| 212 | + } |
| 213 | + return ans; |
| 214 | +}; |
| 215 | +``` |
| 216 | + |
| 217 | +#### C# |
| 218 | + |
| 219 | +```cs |
| 220 | +public class Solution { |
| 221 | + public int MaxSubArrayLen(int[] nums, int k) { |
| 222 | + var d = new Dictionary<int, int>(); |
| 223 | + d[0] = -1; |
| 224 | + int ans = 0; |
| 225 | + int s = 0; |
| 226 | + for (int i = 0; i < nums.Length; i++) { |
| 227 | + s += nums[i]; |
| 228 | + if (d.ContainsKey(s - k)) { |
| 229 | + ans = Math.Max(ans, i - d[s - k]); |
| 230 | + } |
| 231 | + if (!d.ContainsKey(s)) { |
| 232 | + d[s] = i; |
| 233 | + } |
| 234 | + } |
| 235 | + return ans; |
| 236 | + } |
| 237 | +} |
| 238 | +``` |
| 239 | + |
166 | 240 | <!-- tabs:end -->
|
167 | 241 |
|
168 | 242 | <!-- solution:end -->
|
|
0 commit comments