今天总算是又一次把4道题全部搞定了,虽然前两题错了三次简直是不能忍,但是好歹算是都做出来了……
说起来,上一次全部做出来已经是什么时候了啊,唉……
给出题目一的试题链接如下:
这一题没啥好多说的,就是分类讨论一下,然后给出结果就行了。
唯一的问题就是注意一下一些边界条件就行了。
给出python代码实现如下:
class Solution:
def maximumTime(self, time: str) -> str:
s = list(time)
for idx, c in enumerate(s):
if c != '?':
continue
if idx == 0:
if time[idx+1] in "0123?":
s[idx] = '2'
else:
s[idx] = "1"
elif idx == 1:
if s[idx-1] == "2":
s[idx] = "3"
else:
s[idx] = "9"
elif idx == 3:
s[idx] = "5"
else:
s[idx] = '9'
return "".join(s)
提交代码评测得到:耗时20ms,占用内存14.1MB。属于当前最优算法。
给出题目二的试题链接如下:
这一题一开始想岔了,然后就错了一次,后来想想事实上由于字符只会是英文字符,因此,我们只需要考虑以下几种情况即可:
遍历ch的26种可能性,然后分别比较结果取最小值即可。
给出python代码实现如下:
class Solution:
def minCharacters(self, a: str, b: str) -> int:
n1, n2 = len(a), len(b)
cnt_a = Counter(a)
cnt_b = Counter(b)
res = math.inf
for c in string.ascii_lowercase:
if c == 'z':
s1, s2 = math.inf, math.inf
else:
s1 = sum([cnt_a[ch] for ch in cnt_a if ch > c]) + sum([cnt_b[ch] for ch in cnt_b if ch <= c])
s2 = sum([cnt_b[ch] for ch in cnt_b if ch > c]) + sum([cnt_a[ch] for ch in cnt_a if ch <= c])
s3 = n1 + n2 - cnt_a[c] - cnt_b[c]
res = min(res, s1, s2, s3)
return res
提交代码评测得到:耗时108ms,占用内存15.1MB。为当前最优算法实现。
给出题目三的试题链接如下:
这一题的思路事实上也挺直接的,就是求出每个坐标对应的值的大小,然后排序之后求第k大的数即可。
因此,问题就在于如何快速地求出每个坐标下的数。
由于x ^ x == 0
,因此,我们可以得到递推公式:
f[i][j] = matrix[i][j] ^ f[i-1][j] ^ f[i][j-1] ^ f[i-1][j-1]
给出python代码实现如下:
class Solution:
def kthLargestValue(self, matrix: List[List[int]], k: int) -> int:
n = len(matrix)
m = len(matrix[0])
nums = [matrix[0][0] for _ in range(n*m)]
for i in range(n):
for j in range(m):
if i == 0 and j == 0:
continue
elif i == 0:
matrix[i][j] = matrix[i][j] ^ matrix[i][j-1]
elif j == 0:
matrix[i][j] = matrix[i-1][j] ^ matrix[i][j]
else:
matrix[i][j] = matrix[i][j] ^ matrix[i-1][j] ^ matrix[i][j-1] ^ matrix[i-1][j-1]
nums[i*m+j] = matrix[i][j]
nums = sorted(nums, reverse=True)
return nums[k-1]
提交代码评测得到:耗时3932ms,占用内存42.2MB。
给出题目四的试题链接如下:
这道题事实上就是一道数学题,我们可以写一下头部的几个值的答案如下:
1,
2, 3, 3
4, 5, 5, 6, 6, 6,
7, 8, 8, 9, 9, 9, 10, 10, 10, 10,
11, 12, 12, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15
……
可以看到,基本而言,规律还是挺好找的。
因此,我们可以快速地给出对于每一行的长度如下: a i = i ⋅ ( i + 1 ) 2 a_i=\frac{i\cdot(i+1)}{2} ai=2i⋅(i+1),
而需要填满前 i i i行所需要的箱子数为:
S i = ∑ i ( a i ) = 1 6 n 3 + 1 2 n 2 + 1 3 n S_i = \sum_i(a_i) = \frac{1}{6}n^3 + \frac{1}{2}n^2 + \frac{1}{3}n Si=i∑(ai)=61n3+21n2+31n
因此,我们用二分法确定一下当给定n个箱子时,所需要消耗的最小的地面面积即可。
给出python代码实现如下:
class Solution:
def minimumBoxes(self, n: int) -> int:
def S(n):
return (n*n*n + n*n*3 + n*2)/6
def a(n):
return n * (n+1) / 2
if n == 1:
return 1
i, j = 1, n
while i < j-1:
m = (i+j) // 2
if S(m) > n:
j = m
else:
i = m
base = i * (i+1) // 2
delta = n - S(i)
i, j = 0, delta
while i < j-1:
m = (i+j) // 2
if a(m) >= delta:
j = m
else:
i = m
return int(base + j)
提交代码评测得到:耗时28ms,占用内存14.4MB。为当前最优算法实现。