LeetCode 每日一题 2022/11/14-2022/11/20

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步




11/14 805. 数组的均值分割

A,B的平均数avg即为nums的平均数
选取k个数 总和=kavg k最多只要考虑半数nums
sum(A) = k
sum(nums)/n 如果不存在则可以提前退出
dp[i]存储选取i个数可以得到的sum

def splitArraySameAverage(nums):
    """
    :type nums: List[int]
    :rtype: bool
    """
    n = len(nums)
    s = sum(nums)
    m = n//2
    
    tag = False
    for k in range(1,n+1):
        if (s*k)%n==0:
            tag = True
            break
    if not tag:
        return False
    
    dp = [set() for _ in range(m+1)]
    dp[0].add(0)
    for num in nums:
        for i in range(m,0,-1):
            for j in dp[i-1]:
                cur = j+num
                if cur*n == s*i:
                    return True
                dp[i].add(cur)
    return False



11/15 1710. 卡车上的最大单元数

将箱子可装载数量从大到小排序 依次取出

def maximumUnits(boxTypes, truckSize):
    """
    :type boxTypes: List[List[int]]
    :type truckSize: int
    :rtype: int
    """
    boxTypes.sort(key=lambda x:x[1],reverse=True)
    ans = 0
    for i,v in boxTypes:
        if i>=truckSize:
            ans += truckSize*v
            break
        ans += i*v
        truckSize-=i
    return ans




11/16 775. 全局倒置与局部倒置

一个局部倒置必定是全局倒置
如果要数量一致 需要满足所有全局倒置都是局部倒置
不存在 i+1<j nums[i]>nums[j]
检查nums[i] > min(nums[i+2]…nums[n-1])
从后往前 记录最小值 判断nums[i]是否>min
如果成立说明不满足题目条件

def isIdealPermutation(nums):
    """
    :type nums: List[int]
    :rtype: bool
    """
    minv = nums[-1]
    n = len(nums)
    for i in range(n-2,0,-1):
        if nums[i-1]>minv:
            return False
        minv = min(minv,nums[i])
    return True



11/17 792. 匹配子序列的单词数

将每个单词word当前需要匹配的字母放入dic中
从头比那里s 将每个匹配到的字母单词考虑后一个单词

def numMatchingSubseq(s, words):
    """
    :type s: str
    :type words: List[str]
    :rtype: int
    """
    from collections import defaultdict
    dic = defaultdict(list)
    ans = 0
    for i,w in enumerate(words):
        dic[w[0]].append((i,0))
    for c in s:
        l = dic[c]
        dic[c] = []
        for i,loc in l:
            loc+=1
            if loc == len(words[i]):
                ans+=1
            else:
                dic[words[i][loc]].append((i,loc))
    return ans




11/18 891. 子序列宽度之和

将所有数从小到大排列
对于nums[i]
作为最大值的贡献 即为i左侧的子序列个数 2^i
作为最小值的贡献 即为i右侧的子学列个数 2^(n-1-i)
nums[i]的贡献为 (2i-2(n-1-i))*nums[i]

def sumSubseqWidths(nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    MOD = 10**9+7
    n = len(nums)
    nums.sort()
    l = [0]*n
    base = 1
    for i in range(n):
        l[i] = base
        base = (base*2)%MOD
    ans = 0
    for i in range(n):
        num = nums[i]
        ans = (ans+(l[i]*num)%MOD-(l[n-1-i]*num)%MOD)%MOD
    return (MOD+ans)%MOD



11/19 1732. 找到最高海拔

依序遍历记录当前海拔 以及途径最高海拔

def largestAltitude(gain):
    """
    :type gain: List[int]
    :rtype: int
    """
    cur,ans = 0,0
    for v in gain:
        cur +=v
        ans = max(ans,cur)
    return ans




11/20 799. 香槟塔

将所有香槟倒满row=0
判断下一行 如果上一行邻近两个位置满了 则倒入此杯一半

def champagneTower(poured, query_row, query_glass):
    """
    :type poured: int
    :type query_row: int
    :type query_glass: int
    :rtype: float
    """
    row = [poured]
    for i in range(1,query_row+1):
        tmp = [0]*(i+1)
        for j ,v in enumerate(row):
            if v>1:
                tmp[j] += (v-1)/2
                tmp[j+1] += (v-1)/2
        row = tmp
    return min(1,row[query_glass])



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值