LeetCode笔记:Weekly Contest 246 比赛记录

Posted 墨客无言

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode笔记:Weekly Contest 246 比赛记录相关的知识,希望对你有一定的参考价值。

1. 题目一

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

1. 解题思路

区分奇偶数的唯一区别在于末尾位,因此,我们只要找到从尾部开始的第一个奇数的字符然后将其之前所有的数字全部保留即可得到最大的奇数子串。

2. 代码实现

给出python代码实现如下:

class Solution:
    def largestOddNumber(self, num: str) -> str:
        n = len(num)
        while n > 0 and int(num[n-1]) % 2 == 0:
            n -= 1
        return num[:n]

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

2. 题目二

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

1. 解题思路

这题就是枚举一下就行了,唯一需要注意的就是两个边界条件:

  1. 如果finish time早于start time,说明跨天了,需要将finish time加上24小时;
  2. 如果start time和finish time在小时上面保持一直,那么两者之间没有空余,计算开始时间之后的局数以及结束时间之前的局数相加之后需要减去这个小时能够进行的总的局数(即4)。

2. 代码实现

我们给出python代码实现如下:

class Solution:
    def numberOfRounds(self, startTime: str, finishTime: str) -> int:
        h1, m1 = [int(t) for t in startTime.split(":")]
        h2, m2 = [int(t) for t in finishTime.split(":")]
        if h1 > h2 or (h1 == h2 and m1 >= m2):
            h2 += 24
        bg = 4 - math.ceil(m1 / 15)
        ed = m2 // 15
        du = (h2-h1-1) * 4
        if h1 == h2:
            return bg + ed - 4
        else:
            return bg + ed + du

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

3. 题目三

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

1. 解题思路

这一题暴力求解即可。

我们首先通过dfs找到grid2中所有的岛屿,然后看一下对于这些找到的岛屿,是否在grid1均为陆地即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def countSubIslands(self, grid1: List[List[int]], grid2: List[List[int]]) -> int:
        n, m = len(grid1), len(grid1[0])
        cnt = 0
        for i in range(n):
            for j in range(m):
                if grid2[i][j] == 0:
                    continue
                grid2[i][j] = 0
                s = [(i, j)]
                seen = []
                while s != []:
                    x, y = s.pop(0)
                    seen.append((x, y))
                    if x-1 >= 0 and grid2[x-1][y] == 1:
                        grid2[x-1][y] = 0
                        s.append((x-1, y))
                    if x+1 < n and grid2[x+1][y] == 1:
                        grid2[x+1][y] = 0
                        s.append((x+1, y))
                    if y-1 >= 0 and grid2[x][y-1] == 1:
                        grid2[x][y-1] = 0
                        s.append((x, y-1))
                    if y+1 < m and grid2[x][y+1] == 1:
                        grid2[x][y+1] = 0
                        s.append((x, y+1))
                if all(grid1[x][y] == 1 for x, y in seen):
                    cnt += 1
        return cnt

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

4. 题目四

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

1. 解题思路

这一题我的解法也是暴力求解,用一个累积counter来记录下任意一个位置时前面累积的每一个数字的计数,然后将首尾相减即可得到区间内的所有数字的计数,然后计算一下他们的最近邻元素距离即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def minDifference(self, nums: List[int], queries: List[List[int]]) -> List[int]:
        _max = max(nums) + 1
        n = len(nums)
        cnt = [[0 for _ in range(_max)] for _ in range(n+1)]
        res = [101 for _ in queries]
        for i in range(n):
            cnt[i+1][nums[i]] += 1
            for j in range(_max):
                cnt[i+1][j] += cnt[i][j]
        for idx, (bg, ed) in enumerate(queries):
            delta = [cnt[ed+1][i]-cnt[bg][i] for i in range(_max)]
            pre = 0
            for i in range(1, _max):
                if delta[i] == 0:
                    continue
                if pre != 0:
                    res[idx] = min(res[idx], i - pre)
                pre = i
            if res[idx] == 101:
                res[idx] = -1 
        return res

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

emmmm,果然性能好挫……

以上是关于LeetCode笔记:Weekly Contest 246 比赛记录的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode笔记:Weekly Contest 317

LeetCode笔记:Weekly Contest 288

LeetCode笔记:Weekly Contest 299

LeetCode笔记:Weekly Contest 307

LeetCode笔记:Weekly Contest 325

LeetCode笔记:Weekly Contest 314