Skip to content

Commit 3472aaa

Browse files
author
wangpeng
committed
feat(MEDIUM): 2004_longestOnes
1 parent 597073e commit 3472aaa

File tree

1 file changed

+117
-0
lines changed

1 file changed

+117
-0
lines changed
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package pp.arithmetic.leetcode;
2+
3+
/**
4+
* Created by wangpeng on 2019-03-26.
5+
* 1004. 最大连续1的个数 III
6+
* <p>
7+
* 给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。
8+
* <p>
9+
* 返回仅包含 1 的最长(连续)子数组的长度。
10+
* <p>
11+
* <p>
12+
* <p>
13+
* 示例 1:
14+
* <p>
15+
* 输入:A = [1,1,1,0,0,0,1,1,1,1,0], K = 2
16+
* 输出:6
17+
* 解释:
18+
* [1,1,1,0,0,1,1,1,1,1,1]
19+
* 粗体数字从 0 翻转到 1,最长的子数组长度为 6。
20+
* 示例 2:
21+
* <p>
22+
* 输入:A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
23+
* 输出:10
24+
* 解释:
25+
* [0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
26+
* 粗体数字从 0 翻转到 1,最长的子数组长度为 10。
27+
* <p>
28+
* <p>
29+
* 提示:
30+
* <p>
31+
* 1 <= A.length <= 20000
32+
* 0 <= K <= A.length
33+
* A[i] 为 0 或 1
34+
*
35+
* @see <a href="https://leetcode-cn.com/problems/max-consecutive-ones-iii/">max-consecutive-ones-iii</a>
36+
*/
37+
public class _1004_longestOnes {
38+
39+
public static void main(String[] args) {
40+
_1004_longestOnes ones = new _1004_longestOnes();
41+
System.out.println(ones.longestOnes2(new int[]{1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0}, 2));
42+
System.out.println(ones.longestOnes2(new int[]{0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1}, 3));
43+
System.out.println(ones.longestOnes2(new int[]{1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1}, 144));
44+
}
45+
46+
/**
47+
* 解法优化,时间复杂度O(2n)
48+
* 真正的是创建一个窗口进行移动,关键是在于窗口是如何移动的
49+
*
50+
* @param A
51+
* @param K
52+
* @return
53+
*/
54+
public int longestOnes2(int[] A, int K) {
55+
int lonest = 0;
56+
int li = 0, ri = 0;
57+
int zores = 0;
58+
for (ri = 0; ri < A.length; ri++) {
59+
if (A[ri] == 0) zores++;
60+
while (zores > K) {
61+
if (A[li++] == 0) zores--;
62+
}
63+
lonest = Math.max(lonest, ri - li + 1);
64+
}
65+
66+
return lonest;
67+
}
68+
69+
/**
70+
* 耗时较严重,需要优化,时间复杂度O(n^2)
71+
*
72+
* @param A
73+
* @param K
74+
* @return
75+
*/
76+
public int longestOnes(int[] A, int K) {
77+
int left = -1, right = -1;
78+
int count = K;
79+
int longest = 0;
80+
for (int i = 0; i < A.length; i++) {
81+
//第一次都是从1开始
82+
if (A[i] == 0 && left == right) {
83+
continue;
84+
}
85+
if (left == right) {
86+
left = i;
87+
right = i + 1;
88+
continue;
89+
}
90+
if (A[i] == 1) {
91+
right = i;
92+
continue;
93+
}
94+
if (A[i] == 0 && count > 0) {
95+
right = i;
96+
count--;
97+
continue;
98+
}
99+
//消化结束
100+
longest = Math.max(longest, right - left + 1);
101+
//找下一个为0的位置开始
102+
int index = left;
103+
while (A[index] != 0 && index < A.length) {
104+
index++;
105+
}
106+
i = index;
107+
left = right = index;
108+
count = K;
109+
}
110+
if (left != right) {
111+
longest = Math.max(longest, right - left + 1 + count);
112+
}
113+
longest = Math.min(longest, A.length);
114+
115+
return longest;
116+
}
117+
}

0 commit comments

Comments
 (0)