• 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
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    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
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

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

    一个局部倒置必定是全局倒置
    如果要数量一致 需要满足所有全局倒置都是局部倒置
    不存在 i+1nums[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
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    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
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    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
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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])
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

  • 相关阅读:
    JDK软件安装+环境变量配置图文详解(Win10环境)
    配置 iSCSI 服务并实现客户端自动挂载块设备
    1024程序员狂欢节特辑 | ELK+ 协同过滤算法构建个性化推荐引擎,智能实现“千人千面”
    Python3 - Docker部署Libre Office Online在线文件转换
    力扣(LeetCode)1732. 找到最高海拔(C++)
    深度融入垂直行业是物联网未来发展必由之路
    FT2004(D2000)开发实战之U-boot环境变量
    Reset信号如何同步?
    计算机毕业设计ssm点餐系统平台l4fk2系统+程序+源码+lw+远程部署
    代码随想录算法训练营第四十四天| LeetCode518. 零钱兑换 II、LeetCode377. 组合总和 Ⅳ
  • 原文地址:https://blog.csdn.net/zkt286468541/article/details/127906150