leetcode每日一题【Day1】——643. 子数组最大平均数 I

  • 类型:固定长度的滚动窗口
  • 题目:【643. 子数组最大平均数 I】给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。
  • 参考题解:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/yi-ge-mo-ban-miao-sha-10dao-zhong-deng-n-sb0x/
  • 思路:固定长度的窗口用if,判断达到了窗口长度
#列表遍历
def findMaxAverage(self, nums: List[int], k: int) -> float:
    #初始化目标
    sum_num=sum(nums[start:end+1])
    avg_num=maxavg=sum_num/k
    #初始化窗口:start是数字初始化,end是循环初始化
    start=0
    for end in range(k,len(nums)): 
    #更新目标
        sum_num=sum_num-nums[start]+nums[end]
        avg_num=sum_num/k
        maxavg=max(maxavg,avg_num)   
    #更新窗口:start是数字更新,end是循环更新
        start+=1
    return maxavg

#enumerate遍历
def findMaxAverage(self, nums: List[int], k: int) -> float:  
	sum_win=0
    max_sum=-math.inf
    left=0
    length=0
    for right,value in enumerate(nums):
        length+=1
        sum_win+=nums[right]
        if length==k:
        	#当窗口长度达到k时输出结果
            max_sum=max(max_sum,sum_win)
            sum_win-=nums[left]
            left+=1
            length-=1
    return max_sum/k

同题转化

1423. 可获得的最大点数

  • 题目:几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints给出。每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k张卡牌。你的点数就是你拿到手中的所有卡牌的点数之和。给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。
  • 思路: 取两端得最大<>取中间得最小
def maxScore(self, cardPoints: List[int], k: int) -> int:
    sum_,min_sum=0,math.inf #维护
    left=0
    for right in range(len(cardPoints)):
        sum_+=cardPoints[right]
        if right-left+1==len(cardPoints)-k:
            min_sum=min(min_sum,sum_)
            sum_-=cardPoints[left]
            left+=1
    return sum(cardPoints) if k==len(cardPoints) else sum(cardPoints)-min_sum

  • 明日计划:3. 无重复字符的最长子串
  • 补充思考:2021.8.20
    今天开始看labuladong算法小抄,突然对算法有了更深的理解。最初开始刷是因为考研需要,后来是今年第一份算法实习,虽然只是一个调参侠,一个月的时间做了三个小项目,但是能清晰认识到需要回头刷算法题来巩固自己的代码思维和能力。这是必要性。至于怎么开始实践,其实自己捣鼓了好几天,很幸运看到了这本书,作者认为算法其实就是遍历+访问数据结构,而数据结构是以数组和链表为基础的。从二叉树开始练习有助于最高效地抓住框架。

你可能感兴趣的:(算法,算法)