39
39
40
40
<!-- 这里可写通用的实现逻辑 -->
41
41
42
- 前缀和加哈希表,把 0 当作 -1 处理,题目变成求和为 0 的子数组
42
+ 前缀和 + 哈希表,把 0 当作 -1 处理,题目变成求和为 0 的子数组。
43
+
44
+ 遍历数组,用哈希表 mp 记录某个前缀和第一次出现的位置。初始值 ` mp[0] = -1 ` 。
45
+
46
+ 当前缀和 s 在此前出现过,说明这两个前缀和区间差构成的所有元素和为 0,满足条件,更新 ans 值。否则将 s 记录到 mp 中。
47
+
48
+ 最后返回 ans。
49
+
50
+ > 这里初始化 ` mp[0] = -1 ` ,是为了统一操作。当数组从第一个元素开始的前 n 个元素的和为 0 时,也可以用 ` ans = max(ans, i - mp[s]) ` 。
43
51
44
52
<!-- tabs:start -->
45
53
50
58
``` python
51
59
class Solution :
52
60
def findMaxLength (self , nums : List[int ]) -> int :
53
- m = { 0 : - 1 }
54
- ans, sum = 0 , 0
55
- for i, num in enumerate (nums):
56
- sum += 1 if num == 1 else - 1
57
- if sum in m :
58
- ans = max (ans, i - m[ sum ])
61
+ s = ans = 0
62
+ mp = { 0 : - 1 }
63
+ for i, v in enumerate (nums):
64
+ s += 1 if v == 1 else - 1
65
+ if s in mp :
66
+ ans = max (ans, i - mp[s ])
59
67
else :
60
- m[ sum ] = i
68
+ mp[s ] = i
61
69
return ans
62
70
```
63
71
@@ -68,38 +76,57 @@ class Solution:
68
76
``` java
69
77
class Solution {
70
78
public int findMaxLength (int [] nums ) {
71
- Map<Integer , Integer > m = new HashMap<> ();
72
- m . put(0 , - 1 );
73
- int ans = 0 , sum = 0 ;
74
- for (int i = 0 ; i < nums. length; i ++ ) {
75
- sum += nums[i] == 1 ? 1 : - 1 ;
76
- if (m . containsKey(sum )) {
77
- ans = Math . max(ans, i - m . get(sum ));
79
+ Map<Integer , Integer > mp = new HashMap<> ();
80
+ mp . put(0 , - 1 );
81
+ int s = 0 , ans = 0 ;
82
+ for (int i = 0 ; i < nums. length; ++ i ) {
83
+ s += nums[i] == 1 ? 1 : - 1 ;
84
+ if (mp . containsKey(s )) {
85
+ ans = Math . max(ans, i - mp . get(s ));
78
86
} else {
79
- m . put(sum , i);
87
+ mp . put(s , i);
80
88
}
81
89
}
82
90
return ans;
83
91
}
84
92
}
85
93
```
86
94
95
+ ### ** C++**
96
+
97
+ ``` cpp
98
+ class Solution {
99
+ public:
100
+ int findMaxLength(vector<int >& nums) {
101
+ unordered_map<int, int> mp;
102
+ int s = 0, ans = 0;
103
+ mp[ 0] = -1;
104
+ for (int i = 0; i < nums.size(); ++i)
105
+ {
106
+ s += nums[ i] == 1 ? 1 : -1;
107
+ if (mp.count(s)) ans = max(ans, i - mp[ s] );
108
+ else mp[ s] = i;
109
+ }
110
+ return ans;
111
+ }
112
+ };
113
+ ```
114
+
87
115
### **Go**
88
116
89
117
```go
90
118
func findMaxLength(nums []int) int {
91
- m := map [int ]int {0 : -1 }
92
- ans , sum := 0 , 0
93
- for i , num := range nums {
94
- if num == 0 {
95
- sum -= 1
96
- } else {
97
- sum += 1
119
+ mp := map[int]int{0: -1}
120
+ s, ans := 0, 0
121
+ for i, v := range nums {
122
+ if v == 0 {
123
+ v = -1
98
124
}
99
- if j , ok := m[sum]; ok {
125
+ s += v
126
+ if j, ok := mp[s]; ok {
100
127
ans = max(ans, i-j)
101
128
} else {
102
- m[sum ] = i
129
+ mp[s ] = i
103
130
}
104
131
}
105
132
return ans
@@ -113,29 +140,6 @@ func max(a, b int) int {
113
140
}
114
141
```
115
142
116
- ### ** C++**
117
-
118
- ``` cpp
119
- class Solution {
120
- public:
121
- int findMaxLength(vector<int >& nums) {
122
- int presum = 0;
123
- int maxlen = 0;
124
- unordered_map<int, int> mp;
125
- mp[ 0] = -1;
126
- for (int i = 0; i < nums.size(); i++) {
127
- presum += nums[ i] == 0? -1: 1;
128
- if (mp.find(presum) != mp.end())
129
- maxlen = max(maxlen, i - mp[ presum] );
130
- else
131
- mp[ presum] = i;
132
- }
133
-
134
- return maxlen;
135
- }
136
- };
137
- ```
138
-
139
143
### ** ...**
140
144
141
145
```
0 commit comments