class Solution:
def findMaxConsecutiveOnes(self, nums: List[int]) -> int:
#滑动窗口法
res = 0
i = 0
windows = []
tmp = 0
while i<len(nums):
if nums[i]!=0:
windows.append(nums[i])
else:
tmp = len(windows)
windows.clear()
i+=1
res = max(res,max(tmp,len(windows)))
return res
#记录有几个连续的1,不用额外空间存储
index = -1
res = 0
for i,num in enumerate(nums):
if num==0:
index = i
else:
res = max(res,i-index)
return res
#使用位运算
num = int(''.join([str(i) for i in nums]),base=2)
res = 0
while num>0:
num&=num<<1
res+=1
return res
- 滑动窗口法
- 如果没有遇到0就给窗口添加元素
- 如果是0计算当前的窗口长度并且清空窗口
- 更新最大值,这快有一个细节就是最后一个元素可能是1而不是0所有还要进行比较一下
- 计数法
- 初始化的index为-1
- 如果当前数字为0,那就将0的下标赋值给index
- 如果当前数字不为0,那就用当前的坐标i-index更新最大连续数
- 位运算法
- 将列表转化为字符串,然后将字符串(只含有0,1)转为整数
- 然后利用位运算进行操作,当前数字和该数字左移之后进行与操作,直到num等于0,计数即可
- 返回计数的结果
总结:位运算是一个非常巧妙的计算数组中有几个连续的1。num&num<<1;res+=1
class Solution:
def longestOnes(self, A: List[int], K: int) -> int:
#题目的关键是转化为找到一个最长的字符串,该字符串含有最多不超过K个0
size = len(A)
right,left = 0,0
zeros = 0
res = 0
while right<size:
#对0的个数计数
if A[right]==0:
zeros+=1
#如果0的个数超过K,那判断左指针是否为0,如果左指针为0,0的个数减去1,然后左指针向右移动
while zeros>K:
if A[left]==0:
zeros-=1
left+=1
#更新字符串的最长长度
res = max(res,right-left+1)
right+=1
return res
- 题意要做一个转换,最多可将K个0转换为1,然后求包含1 的最长连续子数组的长度。转换为:求一个最长连续的字符串,该字符串最多包含不超过K个0
- 经过上述转换那就直接使用滑动窗口做法就可以了
- 不断移动右指针,然后计算0的个数
- 如果0的个数是大于K的,判断左指针是否为0,如果左指针为0的话,那么0的个数减去1,且将左指针向右移动
- 更新最长连续的字符串长度
总结:对于类似替换字符的题目我们都可以转换为计算一个最长连续的字符串,包含几个不同的字符就可以了。