[LeetCode] 第193场周赛

P3

给你一个整数数组 bloomDay,以及两个整数 m 和 k 。

现需要制作 m 束花。制作花束时,需要使用花园中 相邻的 k 朵花 。

花园中有 n 朵花,第 i 朵花会在 bloomDay[i] 时盛开,恰好 可以用于 一束 花中。

请你返回从花园中摘 m 束花需要等待的最少的天数。如果不能摘到 m 束花则返回 -1 。

解题思路:

  1. 第一个想法是用dp记录以第i多花作为最后一个选择的花构成一束花,所需要要的虽少时间. 但是,我需要超过 O ( m n ) O(mn) O(mn)的时间。很显然,超时了
  2. 看到数据范围,每一次检测一个值是否合法的时间开销是 O ( n ) O(n) O(n), 而且给定的时间是有上界的,用二分检测每个时间是否合理。
class Solution:
    def minDays(self, A: List[int], m: int, k: int) -> int:
        def check(p):
            mi = 0
            cur = 0
            for x in A:
                if x <= p:
                    cur += 1
                else:
                    cur = 0
                if cur >= k:
                    cur -= k
                    mi+=1
            return mi >= m
        
        def bs(l,r):
            if l > r: return -1 
            if l == r and check(l): return l
            mid = (l + r) // 2
            if check(mid):
                return bs(1,mid)
            else:
                return bs(mid+1, r)
        return bs(1, 10**9)

P4

给你一个整数数组 bloomDay,以及两个整数 m 和 k 。

现需要制作 m 束花。制作花束时,需要使用花园中 相邻的 k 朵花 。

花园中有 n 朵花,第 i 朵花会在 bloomDay[i] 时盛开,恰好 可以用于 一束 花中。

请你返回从花园中摘 m 束花需要等待的最少的天数。如果不能摘到 m 束花则返回 -1 。

解法:

  1. 如果我们要暴力解法,狠明显会超时。通常加快,跳跃速度的方法是建立一个索引。
  2. 我们只要在预处理时,建立一个倍增的索引即可。
class TreeAncestor:

    def __init__(self, n: int, parent: List[int]):
        self.d = {}
        self.parent = {}
        i = 1
        while i < n:
            self.parent[i] = {}
            if i == 1:
                for j in range(n):
                    self.parent[i][j] = parent[j]
            else:
                for j in range(n):
                    if self.parent[i//2][j] == -1:
                        self.parent[i][j] = -1
                    else:
                        self.parent[i][j] = self.parent[i//2][self.parent[i // 2][j]]
            i *= 2


    def getKthAncestor(self, node: int, k: int) -> int:
        if node == -1: return -1
        if k == 0: return node
        p = 1
        while 2*p < k:
            p *= 2
        return self.getKthAncestor(self.parent[p][node],k-p)

你可能感兴趣的:(python3,leetcode周赛)