给定一个二进制数组,计算其中最大连续1的个数。
一次遍历法:
Python3代码:
class Solution:
# Leetcode 485. Max Consecutive Ones
# One Pass
# N is the size of nums
# Time Complexity:O(N)
# Space Complexity:O(1)
def findMaxConsecutiveOnes(self, nums: List[int]) -> int:
if nums is None or len(nums) == 0:
return 0
consecutive_ones = 0 if nums[0] == 0 else 1
max_consecutive_ones = consecutive_ones
for i in range(1, len(nums)):
if nums[i] == 1:
consecutive_ones += 1
else:
consecutive_ones = 0
max_consecutive_ones = max(max_consecutive_ones, consecutive_ones)
return max_consecutive_ones
Java代码:
class Solution {
// Leetcode 485. Max Consecutive Ones
// One Pass
// N is the size of nums
// Time Complexity: O(N)
// Space Complexity: O(1)
public int findMaxConsecutiveOnes(int[] nums) {
int consecutiveOnes = 0;
int maxConsecitiveOnes = 0;
if (nums.length == 0)
return 0;
for (int i = 0; i < nums.length ; i++){
if (nums[i] == 1)
consecutiveOnes += 1;
else
consecutiveOnes = 0;
maxConsecitiveOnes = (consecutiveOnes>maxConsecitiveOnes)?consecutiveOnes:maxConsecitiveOnes;
}
return maxConsecitiveOnes;
}
}
动态规划法:
Python3代码:
class Solution:
# Dyname Programming
# N is the size of nums
# Time Complexity:O(N)
# Space Complexity:O(1)
def findMaxConsecutiveOnes(self, nums: List[int]) -> int:
if nums is None or len(nums) == 0:
return 0
nums[0] = 0 if nums[0] == 0 else 1
max_consecutive_ones = nums[0]
for i in range(1, len(nums)):
if nums[i] == 1:
nums[i] = nums[i-1]+1
else:
nums[i] = 0
max_consecutive_ones = max(max_consecutive_ones, nums[i])
return max_consecutive_ones
Java代码:
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int maxConsecitiveOnes = 0;
if (nums.length == 0)
return 0;
if (nums[0] == 1)
maxConsecitiveOnes = nums[0];
for (int i = 1; i < nums.length ; i++){
if (nums[i] == 1)
nums[i] = nums[i-1] + 1;
maxConsecitiveOnes = Math.max(maxConsecitiveOnes, nums[i]);
}
return maxConsecitiveOnes;
}
}
总结:一次遍历法和动态规划法的核心思想都是对着数组遍历一遍,这两种方法的时间复杂度都是O(N),空间复杂度都是O(1)。
动态规划法里面放弃了consecutiveOnes这个变量转而采用改变数组元素的值来统计maxConsecutiveOnes.