@@ -70,11 +70,10 @@ class Solution:
70
70
ans = s if len (cnt) == k else 0
71
71
for i in range (k, len (nums)):
72
72
cnt[nums[i]] += 1
73
- s += nums[i]
74
73
cnt[nums[i - k]] -= 1
75
- s -= nums[i - k]
76
74
if cnt[nums[i - k]] == 0 :
77
- del cnt[nums[i - k]]
75
+ cnt.pop(nums[i - k])
76
+ s += nums[i] - nums[i - k]
78
77
if len (cnt) == k:
79
78
ans = max (ans, s)
80
79
return ans
@@ -93,11 +92,10 @@ class Solution {
93
92
long ans = cnt. size() == k ? s : 0 ;
94
93
for (int i = k; i < n; ++ i) {
95
94
cnt. merge(nums[i], 1 , Integer :: sum);
96
- s += nums[i];
97
95
if (cnt. merge(nums[i - k], - 1 , Integer :: sum) == 0 ) {
98
96
cnt. remove(nums[i - k]);
99
97
}
100
- s -= nums[i - k];
98
+ s += nums[i] - nums[i - k];
101
99
if (cnt. size() == k) {
102
100
ans = Math . max(ans, s);
103
101
}
@@ -116,18 +114,16 @@ public:
116
114
unordered_map<int, ll> cnt;
117
115
ll s = 0;
118
116
for (int i = 0; i < k; ++i) {
119
- cnt[ nums[ i]] ++ ;
117
+ ++ cnt[ nums[ i]] ;
120
118
s += nums[ i] ;
121
119
}
122
120
ll ans = cnt.size() == k ? s : 0;
123
121
for (int i = k; i < n; ++i) {
124
- cnt[ nums[ i]] ++;
125
- s += nums[ i] ;
126
- cnt[ nums[ i - k]] --;
127
- s -= nums[ i - k] ;
128
- if (cnt[ nums[ i - k]] == 0) {
122
+ ++cnt[ nums[ i]] ;
123
+ if (--cnt[ nums[ i - k]] == 0) {
129
124
cnt.erase(nums[ i - k] );
130
125
}
126
+ s += nums[ i] - nums[ i - k] ;
131
127
if (cnt.size() == k) {
132
128
ans = max(ans, s);
133
129
}
@@ -151,12 +147,11 @@ func maximumSubarraySum(nums []int, k int) (ans int64) {
151
147
}
152
148
for i := k; i < n; i++ {
153
149
cnt[nums[i]]++
154
- s += int64(nums[i])
155
150
cnt[nums[i-k]]--
156
- s -= int64(nums[i-k])
157
151
if cnt[nums[i-k]] == 0 {
158
152
delete(cnt, nums[i-k])
159
153
}
154
+ s += int64(nums[i] - nums[i-k])
160
155
if len(cnt) == k && ans < s {
161
156
ans = s
162
157
}
@@ -177,12 +172,11 @@ function maximumSubarraySum(nums: number[], k: number): number {
177
172
let ans = cnt .size === k ? s : 0 ;
178
173
for (let i = k ; i < n ; ++ i ) {
179
174
cnt .set (nums [i ], (cnt .get (nums [i ]) ?? 0 ) + 1 );
180
- s += nums [i ];
181
175
cnt .set (nums [i - k ], cnt .get (nums [i - k ])! - 1 );
182
- s -= nums [i - k ];
183
176
if (cnt .get (nums [i - k ]) === 0 ) {
184
177
cnt .delete (nums [i - k ]);
185
178
}
179
+ s += nums [i ] - nums [i - k ];
186
180
if (cnt .size === k ) {
187
181
ans = Math .max (ans , s );
188
182
}
@@ -191,6 +185,48 @@ function maximumSubarraySum(nums: number[], k: number): number {
191
185
}
192
186
```
193
187
188
+ ``` cs
189
+ public class Solution {
190
+ public long MaximumSubarraySum (int [] nums , int k ) {
191
+ int n = nums .Length ;
192
+ Dictionary < int , int > cnt = new Dictionary <int , int >(k );
193
+ long s = 0 ;
194
+
195
+ for (int i = 0 ; i < k ; ++ i ) {
196
+ if (! cnt .ContainsKey (nums [i ])) {
197
+ cnt [nums [i ]] = 1 ;
198
+ }
199
+ else {
200
+ cnt [nums [i ]]++ ;
201
+ }
202
+ s += nums [i ];
203
+ }
204
+
205
+ long ans = cnt .Count == k ? s : 0 ;
206
+
207
+ for (int i = k ; i < n ; ++ i ) {
208
+ if (! cnt .ContainsKey (nums [i ])) {
209
+ cnt [nums [i ]] = 1 ;
210
+ }
211
+ else {
212
+ cnt [nums [i ]]++ ;
213
+ }
214
+ if (-- cnt [nums [i - k ]] == 0 ) {
215
+ cnt .Remove (nums [i - k ]);
216
+ }
217
+
218
+ s += nums [i ] - nums [i - k ];
219
+
220
+ if (cnt .Count == k ) {
221
+ ans = Math .Max (ans , s );
222
+ }
223
+ }
224
+
225
+ return ans ;
226
+ }
227
+ }
228
+ ```
229
+
194
230
<!-- tabs: end -->
195
231
196
232
<!-- end -->
0 commit comments