leetcode1004. 最大连续1的个数 III
给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。
返回仅包含 1 的最长(连续)子数组的长度。
示例 1:
输入:A = [1,1,1,0,0,0,1,1,1,1,0], K = 2
输出:6
解释:
[1,1,1,0,0,1,1,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 6。
示例 2:
输入:A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
输出:10
解释:
[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 10。
滑动窗口。没有用到评论区那些花里胡哨的,就是一个窗口右边进来怎么处理,左边要出去怎么处理。只不过这么写时间复杂度很高。
public int longestOnes(int[] A, int K) {
int result=0,i=0,j=0,tmp=K;
while(j<A.length) {
if(A[j]==0) {
tmp--;
if(tmp<0) {
//左窗口缩小
while(A[i]!=0) {
i++;
}
i++;
//对于示例1来说,如果不i++,i是第一个0的位置
//但是我们想让他在第二个0的位置
tmp++;
}
}
result=Math.max(j-i+1, result);
j++;
}
return result;
}
在这之后我看了一下4ms的代码,发现差不多。我觉得唯一的差别可能在于最后的比较最大值上面。如果用max函数是9ms,if-else是8ms,而三目运算符只用了 6ms,这个差距还是很大的。但是也不能一概而论,三目运算符不一定永远比if-else快,因为前者还可能会有类型转换的问题。
leetcode 8/100