[LeetCode307周赛] [模拟] [贪心] [DFS+BFS] [堆/二分]

6152. 赢得比赛需要的最少训练时长

https://leetcode.cn/problems/minimum-hours-of-training-to-win-a-competition/

模拟

补充到刚好能打过敌人就可以了。

class Solution:
    def minNumberOfHours(self, initialEnergy: int, initialExperience: int, energy: List[int], experience: List[int]) -> int:
        ans = 0
        curHp = initialEnergy
        curExp = initialExperience
        
        for hp, exp in zip(energy, experience):
            if curHp <= hp:
                ans += hp - curHp + 1
                curHp = hp + 1
            curHp -= hp

            if curExp <= exp:
                ans += exp - curExp + 1
                curExp = exp + 1
            curExp += exp
        
        return ans

6166. 最大回文数字

https://leetcode.cn/problems/largest-palindromic-number/

贪心&模拟

class Solution:
    def largestPalindromic(self, num: str) -> str:
        # 先存入hash 
        hashMap = [0] * 10
        for x in num:
            hashMap[int(x)] += 1

        # 全 0 的时候特判
        if hashMap[0] == len(num):
            return '0'
        
        ans = ''
        # 先选大的, 0 最后处理
        for i in range(9, 0, -1):
            if hashMap[i] >= 2:
                ans += str(i) * (hashMap[i] // 2)

        # 如果已经加入数字,可以填入 0 
        if len(ans) != 0:
            ans += '0' * (hashMap[0] // 2)

        # 找剩下的最大数放中间
        for i in range(9, -1, -1):
            if hashMap[i] % 2 == 1:
                ans += str(i) + ans[::-1]
                break
        else:
            ans += ans[::-1]

        return ans

6154. 感染二叉树需要的总时间

https://leetcode.cn/problems/amount-of-time-for-binary-tree-to-be-infected/

DFS 建图 + BFS 遍历

建图后找出离起始节点最远的距离:

class Solution:
    def amountOfTime(self, root: Optional[TreeNode], start: int) -> int:
        parents = {}
        def dfs(node: Optional[TreeNode], pa: Optional[TreeNode]) -> None:
            if node is None: return
            if node.val == start: self.start = node
            parents[node] = pa
            dfs(node.left, node)
            dfs(node.right, node)
        dfs(root, None)

        ans = -1
        vis = {None, self.start}
        q = [self.start]
        while q:
            ans += 1
            tmp = q
            q = []
            for node in tmp:
                for x in [node.left, node.right, parents[node]]:
                    if x not in vis:
                        vis.add(x)
                        q.append(x)
        return ans

6155. 找出数组的第 K 大和

https://leetcode.cn/problems/find-the-k-sum-of-an-array/
还没搞懂,有时间填坑。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哇咔咔负负得正

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值