40
40
41
41
<!-- 这里可写通用的实现逻辑 -->
42
42
43
- 思路同 [ 2024. 考试的最大困扰度 ] ( /solution/2000-2099/2024.Maximize%20the%20Confusion%20of%20an%20Exam/README.md )
43
+ ** 方法一:滑动窗口 **
44
44
45
- 维护一个单调变长的窗口。这种窗口经常出现在寻求“最大窗口”的问题中:因为要求的是”最大“,所以我们没有必要缩短窗口,于是代码就少了缩短窗口的部分;从另一个角度讲,本题里的 K 是资源数,一旦透支,窗口就不能再增长了。
45
+ 定义一个滑动窗口,窗口内的 $0$ 的个数不超过 $k$,窗口的右边界不断向右移动,当窗口内的 $0$ 的个数超过 $k$ 时,窗口的左边界向右移动,直到窗口内的 $0$ 的个数不超过 $k$ 为止。
46
+
47
+ 时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组的长度。
48
+
49
+ 相似题目:[ 487. 最大连续 1 的个数 II] ( /solution/0400-0499/0487.Max%20Consecutive%20Ones%20II/README.md )
50
+
51
+ 以下是滑动窗口的优化版本。
52
+
53
+ 维护一个单调变长的窗口。这种窗口经常出现在寻求“最大窗口”的问题中:因为求的是“最大”,所以我们没有必要缩短窗口,于是代码就少了缩短窗口的部分;从另一个角度讲,本题里的 K 是资源数,一旦透支,窗口就不能再增长了。
46
54
47
55
- l 是窗口左端点,负责移动起始位置
48
56
- r 是窗口右端点,负责扩展窗口
49
57
- k 是资源数,每次要替换 0,k 减 1,同时 r 向右移动
50
58
- ` r++ ` 每次都会执行,` l++ ` 只有资源 ` k < 0 ` 时才触发,因此 ` r - l ` 的值只会单调递增(或保持不变)
51
59
- 移动左端点时,如果当前元素是 0,说明可以释放一个资源,k 加 1
52
60
61
+ 相似题目: [ 2024. 考试的最大困扰度] ( /solution/2000-2099/2024.Maximize%20the%20Confusion%20of%20an%20Exam/README.md )
62
+
53
63
<!-- tabs:start -->
54
64
55
65
### ** Python3**
56
66
57
67
<!-- 这里可写当前语言的特殊实现逻辑 -->
58
68
69
+ ``` python
70
+ class Solution :
71
+ def longestOnes (self , nums : List[int ], k : int ) -> int :
72
+ ans = 0
73
+ cnt = j = 0
74
+ for i, v in enumerate (nums):
75
+ if v == 0 :
76
+ cnt += 1
77
+ while cnt > k:
78
+ if nums[j] == 0 :
79
+ cnt -= 1
80
+ j += 1
81
+ ans = max (ans, i - j + 1 )
82
+ return ans
83
+ ```
84
+
59
85
``` python
60
86
class Solution :
61
87
def longestOnes (self , nums : List[int ], k : int ) -> int :
@@ -75,6 +101,27 @@ class Solution:
75
101
76
102
<!-- 这里可写当前语言的特殊实现逻辑 -->
77
103
104
+ ``` java
105
+ class Solution {
106
+ public int longestOnes (int [] nums , int k ) {
107
+ int j = 0 , cnt = 0 ;
108
+ int ans = 0 ;
109
+ for (int i = 0 ; i < nums. length; ++ i) {
110
+ if (nums[i] == 0 ) {
111
+ ++ cnt;
112
+ }
113
+ while (cnt > k) {
114
+ if (nums[j++ ] == 0 ) {
115
+ -- cnt;
116
+ }
117
+ }
118
+ ans = Math . max(ans, i - j + 1 );
119
+ }
120
+ return ans;
121
+ }
122
+ }
123
+ ```
124
+
78
125
``` java
79
126
class Solution {
80
127
public int longestOnes (int [] nums , int k ) {
@@ -94,6 +141,28 @@ class Solution {
94
141
95
142
### ** C++**
96
143
144
+ ``` cpp
145
+ class Solution {
146
+ public:
147
+ int longestOnes(vector<int >& nums, int k) {
148
+ int ans = 0;
149
+ int cnt = 0, j = 0;
150
+ for (int i = 0; i < nums.size(); ++i) {
151
+ if (nums[ i] == 0) {
152
+ ++cnt;
153
+ }
154
+ while (cnt > k) {
155
+ if (nums[ j++] == 0) {
156
+ --cnt;
157
+ }
158
+ }
159
+ ans = max(ans, i - j + 1);
160
+ }
161
+ return ans;
162
+ }
163
+ };
164
+ ```
165
+
97
166
```cpp
98
167
class Solution {
99
168
public:
@@ -110,6 +179,33 @@ public:
110
179
111
180
### ** Go**
112
181
182
+ ``` go
183
+ func longestOnes (nums []int , k int ) int {
184
+ ans := 0
185
+ j , cnt := 0 , 0
186
+ for i , v := range nums {
187
+ if v == 0 {
188
+ cnt++
189
+ }
190
+ for cnt > k {
191
+ if nums[j] == 0 {
192
+ cnt--
193
+ }
194
+ j++
195
+ }
196
+ ans = max (ans, i-j+1 )
197
+ }
198
+ return ans
199
+ }
200
+
201
+ func max (a , b int ) int {
202
+ if a > b {
203
+ return a
204
+ }
205
+ return b
206
+ }
207
+ ```
208
+
113
209
``` go
114
210
func longestOnes (nums []int , k int ) int {
115
211
l , r := -1 , -1
0 commit comments