給定一個(gè)二進(jìn)制數(shù)組, 計(jì)算其中最大連續(xù)1的個(gè)數(shù)。
示例 1:
輸入: [1,1,0,1,1,1]
輸出: 3
解釋: 開頭的兩位和最后的三位都是連續(xù)1,所以最大連續(xù)1的個(gè)數(shù)是 3.
注意:
輸入的數(shù)組只包含 0 和1。
輸入數(shù)組的長(zhǎng)度是正整數(shù),且不超過 10,000。
第一次提交的答案:
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
if(nums == null || nums.length == 0) {
return 0;
}
int max = 0;
int temp = 0;
for(int i=0;i<nums.length;i++){
if(nums[i] == 1){
temp ++;
}
if(nums[i] == 0){
//比較max 和 temp
if(max < temp){
max = temp;
}
temp = 0;
}
}
return max;
}
}
題目比較簡(jiǎn)單,但還是出現(xiàn)邊界未檢測(cè)的問題。 上面的代碼只適應(yīng)于以0
結(jié)尾的數(shù)組,如果是[1],[1,0,1,1]
這樣的數(shù)組結(jié)果就錯(cuò)了。解決這個(gè)問題只要在最后判斷下temp和max即可。
正確的答案是: 【耗時(shí): 10ms】
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
if(nums == null || nums.length == 0) {
return 0;
}
int max = 0;
int temp = 0;
for(int i=0;i<nums.length;i++){
if(nums[i] == 1){
temp ++;
}
if(nums[i] == 0){
//比較max 和 temp
if(max < temp){
max = temp;
}
temp = 0;
}
}
if(temp > max) {
return temp;
}
return max;
}
}
還有一種更簡(jiǎn)潔的寫法:
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
if(nums == null || nums.length == 0) {
return 0;
}
int max = 0;
int temp = 0;
for(int i=0;i<nums.length;i++){
if(nums[i] == 1){
temp ++;
if(temp > max){
max = temp;
}
}
else{
temp = 0;
}
}
return max;
}
}
看看別人的思路:記住上次0
出現(xiàn)的位置,然后下次出現(xiàn)0
就可以計(jì)算連續(xù)1的個(gè)數(shù),省去了temp++的過程。
且看實(shí)現(xiàn):
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
if(nums == null || nums.length == 0) {
return 0;
}
int index = -1;
int max = 0;
for(int i=0;i<nums.length;i++) {
if(nums[i] == 0) { //遇到0了,要對(duì)比下
int temp = i - 1 - index;
max = Math.max(temp, max);
index = i;
}
}
max = Math.max(max, nums.length-1-index);
return max;
}
}
總結(jié): 求連續(xù)區(qū)間數(shù)據(jù)不僅可以通過計(jì)數(shù)實(shí)現(xiàn),還可以通過兩端索引之差實(shí)現(xiàn),且后者性能更好。