LeetCode笔记:Weekly Contest 256(补发)

本文记录了LeetCode周赛256中的四道题目,涉及数组排序、最大值查找、任务调度等算法问题。通过Python代码详细解析了解题思路,包括最小差值、最大k大数、任务会话最小数量的计算方法。对于第四题,作者分享了在理解和实现动态规划过程中遇到的挑战,尤其是递推规则的建立。
摘要由CSDN通过智能技术生成

1. 题目一

给出题目一的试题链接如下:

1. 解题思路

这一题其实还好,要使得差值最小,那么选取的k个数一定是连续的,然后我们只需要对原数组进行排序之后比较窗口为k的数据之中最小的差值。

2. 代码实现

给出python代码实现如下:

class Solution:
    def minimumDifference(self, nums: List[int], k: int) -> int:
        nums = sorted(nums)
        n = len(nums)
        return min(nums[i+k-1]-nums[i] for i in range(n-k+1))

提交代码评测得到:耗时96ms,占用内存14.6MB。

2. 题目二

给出题目二的试题链接如下:

1. 解题思路

这一题只要对数组进行排序然后取第k大的即可。

只是需要注意的是,在排序是需要对字符串进行左侧补0操作,确保不会因为位数的不同导致的排序错误。

2. 代码实现

给出python代码实现如下:

class Solution:
    def kthLargestNumber(self, nums: List[str], k: int) -> str:
        l = max(len(x) for x in nums)
        nums = sorted(nums, key= lambda x: x.rjust(l, '0'))
        return nums[-k]

提交代码评测得到:耗时256ms,占用内存22.8MB。

3. 题目三

给出题目三的试题链接如下:

1. 解题思路

这一题的思路就是暴力地使用迭代求解。

2. 代码实现

给出python代码实现如下:

class Solution:
    def minSessions(self, tasks: List[int], sessionTime: int) -> int:
        tasks = sorted(tasks, reverse=True)
        n = len(tasks)
        status = 2**n-1
        
        @lru_cache(None)
        def dp(status, remain):
            if status == 0:
                return 0
            if any(status & (1 << (n-1-i)) and tasks[i] <= remain for i in range(n)):
                return min(dp(status ^ (1 << (n-1-i)), remain - tasks[i]) for i in range(n) if status & (1 << (n-1-i)) and tasks[i] <= remain)
            else:
                for i in range(n):
                    if status & (1 << (n-1-i)):
                        return 1 + dp(status ^ (1 << (n-1-i)), sessionTime-tasks[i])
        
        return 1 + dp(status, sessionTime)        

提交代码评测得到:耗时228ms,占用内存17.7MB。

4. 题目四

给出题目四的试题链接如下:

这一题思路比较好想,就是动态规划,但是递推规则没有太想明白,主要是其中的去重规则,想了一周都没有搞定,后来看了答案之后发现是通过使用容斥原理进行证明的,就挺挫败的,唉……

这里就还是直接把官方解答链接贴这里吧,有兴趣的读者可以看看,写的还是不错的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值