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. 题目四
给出题目四的试题链接如下:
这一题思路比较好想,就是动态规划,但是递推规则没有太想明白,主要是其中的去重规则,想了一周都没有搞定,后来看了答案之后发现是通过使用容斥原理进行证明的,就挺挫败的,唉……
这里就还是直接把官方解答链接贴这里吧,有兴趣的读者可以看看,写的还是不错的。