LeetCode笔记:Weekly Contest 225 比赛记录

0. 赛后总结

今天总算是又一次把4道题全部搞定了,虽然前两题错了三次简直是不能忍,但是好歹算是都做出来了……

说起来,上一次全部做出来已经是什么时候了啊,唉……

1. 题目一

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

1. 解题思路

这一题没啥好多说的,就是分类讨论一下,然后给出结果就行了。

唯一的问题就是注意一下一些边界条件就行了。

2. 代码实现

给出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。属于当前最优算法。

2. 题目二

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

1. 解题思路

这一题一开始想岔了,然后就错了一次,后来想想事实上由于字符只会是英文字符,因此,我们只需要考虑以下几种情况即可:

  1. s1中所有的字符都不大于某个字符ch,而s2中所有的字符都大于该字符;
  2. s2中所有的字符都不大于某个字符ch,而s1中所有的字符都大于该字符;
  3. s1与s2中所有的字符都变换为ch;

遍历ch的26种可能性,然后分别比较结果取最小值即可。

2. 代码实现

给出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。为当前最优算法实现。

3. 题目三

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

1. 解题思路

这一题的思路事实上也挺直接的,就是求出每个坐标对应的值的大小,然后排序之后求第k大的数即可。

因此,问题就在于如何快速地求出每个坐标下的数。

由于x ^ x == 0,因此,我们可以得到递推公式:

f[i][j] = matrix[i][j] ^ f[i-1][j] ^ f[i][j-1] ^ f[i-1][j-1]

2. 代码实现

给出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。

4. 题目四

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

1. 解题思路

这道题事实上就是一道数学题,我们可以写一下头部的几个值的答案如下:

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个箱子时,所需要消耗的最小的地面面积即可。

2. 代码实现

给出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。为当前最优算法实现。

猜你喜欢

转载自blog.csdn.net/codename_cys/article/details/113145711