力扣-数组遍历(485、495、414、628)
数组遍历方法
- 遍历数组值
for x in list:
....
- 遍历数组下标
i=0
while i<len(list):
....
i=i+1
- 遍历数组下标和下标对应的值
for i,v in enumerate(list):
- 遍历下标
for i in range(len(list)):
....
最大连续1的个数(485)
思路: 遍历列表,等于1则a加1,并且比较current和result的大小更新result,若是等于0,则令current=0,最后遍历完返回result。
class Solution:
def findMaxConsecutiveOnes(self, nums: List[int]) -> int:
result=0
current=0
for x in nums:
if x==1:
current=current+1
if current>result:
result=current
else:
current=0
return result
提莫攻击(495)
思路: 比较前一次时间和后一次时间的距离,大于duration则sum加duration,否则sum加上一次时间和后一次时间的差。
class Solution:
def findPoisonedDuration(self, timeSeries: List[int], duration: int) -> int:
sum=0
if timeSeries==[]:
return sum
i=0
while i<len(timeSeries)-1:
if (timeSeries[i+1]-timeSeries[i])>=duration:
sum=sum+duration
else:
sum=sum+(timeSeries[i+1]-timeSeries[i])
i=i+1
sum=sum+duration #加上最后一次中毒的时间
return sum
上面循环中的if判断语句可以这样写:
sum=sum+min(timeSeries[i+1]-timeSeries[i],duration)
第三大数(414)
方法一
思路: 将list集合转换为set集合,计算set集合大小(因为转过去就不会存在重复元素),如果小于3,则返回最大值,否则删除set中第一大和第二大的数,最后函数返回该set集合的最大值即原set中的第三大数。
class Solution:
def thirdMax(self, nums: List[int]) -> int:
nums=set(nums)
if len(nums)<3:
return max(nums)
print(nums)
nums.remove(max(nums))
nums.remove(max(nums))
return max(nums)
方法二
思路: 先把one,two,three设为无穷小,也就是第一、第二、第三,然后在遍历数组的时候更新这三个值。最后如果three还等于负无穷,说明three没有更新,也就是说第三大的没有这个数,于是返回最大值。
class Solution:
def thirdMax(self, nums: List[int]) -> int:
one=two=three=float('-inf')
for x in nums:
if x>one:
three=two
two=one
one=x
elif x>two and x<one:
three=two
two=x
elif x>three and x<two:
three=x
else:
pass
if three==float('-inf'):
return max(nums)
return three
三个数的最大乘积(628)
思路: 现将数组按从大到小次序排序,然后最大值只能是最大的三个正数相乘,或者最大的正数和最小的两个负数相乘。
class Solution:
def maximumProduct(self, nums: List[int]) -> int:
nums=sorted(nums)
return max(nums[-1]*nums[-2]*nums[-3],nums[0]*nums[1]*nums[-1])