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符合条件时会扩大,否则就右移