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符合條件時會擴大,否則就右移