• [Leetcode Weekly Contest]193


    链接:LeetCode

    [Leetcode]5436. 一维数组的动态和

    给你一个数组 nums 。数组「动态和」的计算公式为:(runningSum[i] = sum(nums[0]…nums[i]))
    请返回 nums 的动态和。

    累加即可。

    class Solution:
        def runningSum(self, nums: List[int]) -> List[int]:
            res = []
            cur = 0
            for num in nums:
                cur += num
                res.append(cur)
            return res
    

    [Leetcode]5437. 不同整数的最少数目

    给你一个整数数组 arr 和一个整数 k 。现需要从数组中恰好移除 k 个元素,请找出移除后数组中不同整数的最少数目。

    哈希表,排序即可。

    import collections
    class Solution:
        def findLeastNumOfUniqueInts(self, arr: List[int], k: int) -> int:
            dic = collections.Counter(arr)
            n = len(set(arr))
            vals = sorted(dic.values())
            for val in vals:
                if k<=0:break
                if k>=val:
                    n-=1
                k-=val
            return n
    

    [Leetcode]5438. 制作 m 束花所需的最少天数

    给你一个整数数组 bloomDay,以及两个整数 m 和 k 。
    现需要制作 m 束花。制作花束时,需要使用花园中 相邻的 k 朵花 。
    花园中有 n 朵花,第 i 朵花会在 bloomDay[i] 时盛开,恰好 可以用于 一束 花中。
    请你返回从花园中摘 m 束花需要等待的最少的天数。如果不能摘到 m 束花则返回 -1 。

    如果mid天满足,那么mid+1天也满足,满足单调性,可以二分check。对于当前天数mid,贪心计算有多少个连续的小于等于mid的k天,假设有cnt个连续k天,判断cnt是否大于等于m即可

    class Solution:
        def minDays(self, bloomDay: List[int], m: int, k: int) -> int:
            def check(day):
                n = len(bloomDay)
                flower = [True if v <= day else False for v in bloomDay]
                s, t = 0, 0
                count = 0
                while t < n:
                    if not flower[t]:
                        count += (t - s) // k
                        s = t+1
                    t += 1
                count += (t - s) // k
                return count >= m
    
            left, right = min(bloomDay), max(bloomDay)
            while left <= right:
                day = (left + right) // 2
                if check(day):
                    right = day-1
                else:
                    left = day+1
            return left if check(left) else -1
    

    [Leetcode]5188. 树节点的第 K 个祖先

    给你一棵树,树上有 n 个节点,按从 0 到 n-1 编号。树以父节点数组的形式给出,其中 (parent[i])是节点 i 的父节点。树的根节点是编号为 0 的节点。
    请你设计并实现 getKthAncestor(int node, int k) 函数,函数返回节点 node 的第 k 个祖先节点。如果不存在这样的祖先节点,返回 -1 。
    树节点的第 k 个祖先节点是从该节点到根节点路径上的第 k 个节点。

    DP倍增法,本质类似于二分法。假设状态(dp[node][j]),表示 node 的第 2^j 个祖先,则(dp[node][j] = dp[ dp[node][j-1] ][j-1])

    class TreeAncestor:
    
        def __init__(self, n: int, parent: List[int]):
            self.cols = 20      # log(50000) < 20
    
            self.dp = [[-1] * self.cols for _ in range(n)]
            for i in range(n):
                self.dp[i][0] = parent[i]
            # 动态规划设置祖先, dp[node][j] 表示 node 往前推第 2^j 个祖先
            for i in range(n):
                for j in range(1, self.cols):
                    if self.dp[i][j-1] != -1:
                        self.dp[i][j] = self.dp[self.dp[i][j-1]][j-1]
            return
    
        def getKthAncestor(self, node: int, k: int) -> int:
            for i in reversed(range(self.cols)):
                if k & (1 << i):
                    node = self.dp[node][i]
                    if node == -1:
                        break
            return node
    

    参考:Leetcode

  • 相关阅读:
    Junit单元测试
    win7的6个网络命令
    WOJ1024 (POJ1985+POJ2631) Exploration 树/BFS
    WOJ1022 Competition of Programming 贪心 WOJ1023 Division dp
    woj1019 Curriculum Schedule 输入输出 woj1020 Adjacent Difference 排序
    woj1018(HDU4384)KING KONG 循环群
    woj1016 cherry blossom woj1017 Billiard ball 几何
    woj1013 Barcelet 字符串 woj1014 Doraemon's Flashlight 几何
    woj1012 Thingk and Count DP好题
    woj1010 alternate sum 数学 woj1011 Finding Teamates 数学
  • 原文地址:https://www.cnblogs.com/hellojamest/p/13124834.html
Copyright © 2020-2023  润新知