题目:最大连续1的个数
给定一个二进制数组, 计算其中最大连续1的个数。
Given a binary array, find the maximum number of consecutive 1s in this array.
示例 :
输入: [1,1,0,1,1,1]
输出: 3
解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.
注意:
输入的数组只包含 0 和1。
输入数组的长度是正整数,且不超过 10,000。
------------------------------------------------------------------------
解法1:用一个列表maxL来统计所有的长度temp,然后选出最大的max(maxL)。
class Solution(object):
def findMaxConsecutiveOnes(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
temp = 0 # 用于统计每次的最大1长度
maxL = [] # 用于收集所有的最大长度
for i in range(len(nums)):
if nums[i] == 1:
temp += 1
else:
maxL.append(temp)
temp = 0
# 用于处理以1结尾的nums数组
maxL.append(temp)
return max(maxL)
解法2: 相比解法1,设立一个最大长度变量maxNum来实时记录最大值,只有当临时最大长度temp大于它时,才进行交换。
class Solution(object):
def findMaxConsecutiveOnes(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
temp = 0 # 记录临时最大长度
maxNum = 0 # 记录最大长度
for num in nums:
if num == 1:
temp += 1
elif temp > maxNum:
maxNum = temp
temp = 0
else:
temp = 0
# 用于处理nums结尾是1的情况
if temp > maxNum:
maxNum = temp
return maxNum
解法3:根据只有0和1的条件,设置巧妙的置零操作sum = sum*num + num。
class Solution(object):
def findMaxConsecutiveOnes(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
sum, maxNum = 0, 0
for num in nums:
# sum用于统计所有的最大值:遇到0,就通过*置零
sum = sum*num + num
if sum > maxNum:
maxNum = sum
return maxNum
解法4:网友 llrfighting提供了一个神奇的思路:将数组转换为字符串,再通过 "0" 对字符串进行切分,然后输出最大切断的长度。
class Solution(object):
def findMaxConsecutiveOnes(self, nums: List[int]) -> int:
return max(len(substr) for substr in ''.join([str(x) for x in nums]).split("0"))
参考:
https://blog.youkuaiyun.com/Manson_Wang/article/details/82110263
https://blog.youkuaiyun.com/llrfighting/article/details/89006789