1. Max Consecutive Ones
给出一串由0,1组成的整型array
1)求出最长连续的1序列 LC - 485
思路:从1开始累加求最大值,遇0归零
public int findMaxConsecutiveOnes(int[] nums) {
int result = 0;
int count = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == 1) {
count++;
result = Math.max(count, result);
}
else count = 0;
}
return result;
}
2)求出只含一个0的最长连续序列
思路:记录两段长度,left为0前长度,right为0后长度,遇到下一个0就,l = r,把数传递给left,right重新技术。每次循环求最大。
public int findMaxConsecutiveOnes(int[] nums) {
int l = 0, r = 0;
int res = 0;
for(int i = 0 ; i < nums.length ; i++) {
r++;
if(nums[i] == 0) {
l = r;
r = 0;
}
res = Math.max(res, l + r);
}
return res;
}
3)最多K个0的最长子序列 - LC 1004
思路:双指针left在左,right在右。遇到0递减K,同时如果K小于0左移left,使slide window大小不变,并记录了欠的0的个数,当 left指针遇到 0 时补偿 K。
public int longestOnes(int[] A, int K) {
int i = 0, j = 0;
for(; j < A.length ; j++){
if(A[j] == 0) K--;
if(K < 0 && A[i++] == 0) K++;
}
return j - i;
}
其实也可以当K小于0时,用while loop一直左移left指针。。但上面思路的好处在于不需要单开一个整型存结果,slide window符合条件时会扩大,否则就右移