LeetCode笔记:Weekly Contest 290

Posted Espresso Macchiato

tags:

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

1. 题目一

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

1. 解题思路

这一题思路倒是比较直接,就是遍历然后每次取交集即可。

2. 代码实现

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

class Solution:
    def intersection(self, nums: List[List[int]]) -> List[int]:
        n = len(nums)
        s = set(nums[0])
        for i in range(1, n):
            s = s & set(nums[i])
        return sorted(s)

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

2. 题目二

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

1. 解题思路

这一题我的思路比较暴力,就是一个三重循环。

对每一个圆,我们都找到其中所有的点,然后合在一起返回长度即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def countLatticePoints(self, circles: List[List[int]]) -> int:
        points = set()
        for x, y, r in circles:
            points.add((x, y))
            for i in range(1, r+1):
                points.add((x-i, y))
                points.add((x+i, y))
                points.add((x, y-i))
                points.add((x, y+i))
            for i in range(1, r):
                for j in range(1, r):
                    if i*i + j*j <= r*r:
                        points.add((x-i, y-j))
                        points.add((x-i, y+j))
                        points.add((x+i, y-j))
                        points.add((x+i, y+j))
        # print(points)
        return len(points)

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

3. 题目三

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

1. 解题思路

这一题也还好,就是一个累积矩阵,不过由于x长度很长,所以我们不得不去除掉所有没有真实值的坐标,仅仅对出现了矩阵的x坐标进行记录。

而y方向上由于总共只有100个可取的值,所以这里就偷了个懒,直接全部记录了。

剩下的,我们就是求一下累积矩阵就是了,不过唯一特殊的是,这个矩阵是反着来的。

2. 代码实现

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

class Solution:
    def countRectangles(self, rectangles: List[List[int]], points: List[List[int]]) -> List[int]:
        n = len(rectangles)
        rectangles = sorted(rectangles)
        xlist = [x[0] for x in rectangles]
        cnt = [[0 for _ in range(101)] for _ in range(n+1)]
        # print(cnt)
        for i, (x, y) in enumerate(rectangles):
            cnt[i][y] += 1
        for i in range(n, 0, -1):
            cnt[i-1][100] += cnt[i][100]
            for j in range(100, 0, -1):
                cnt[i-1][j-1] += cnt[i][j-1] + cnt[i-1][j] - cnt[i][j]
        
        res = []
        for x, y in points:
            idx = bisect.bisect_left(xlist, x)
            res.append(cnt[idx][y])
        return res

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

4. 题目四

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

1. 解题思路

这一题和上一题其实差不多,反而还更加简单一点,就是一个一维的累积数组,不过键值是离散的,只需要记录几个关键节点,即花开和结束的时间。

然后,在对游客进行考察时,需要找到其进入的时间点所处的关键节点位置,从而得到当时开放的花朵的数目。

2. 代码实现

给出python代码实现如下:

class Solution:
    def fullBloomFlowers(self, flowers: List[List[int]], persons: List[int]) -> List[int]:
        cnt = defaultdict(int)
        for st, ed in flowers:
            cnt[st] += 1
            cnt[ed+1] -= 1
        
        timestamps = sorted(cnt.keys())
        
        n = len(timestamps)
        flowers = [cnt[t] for t in timestamps]
        for i in range(n-1):
            flowers[i+1] += flowers[i]

        res = []
        for p in persons:
            idx = bisect.bisect_right(timestamps, p)
            if idx > 0:
                res.append(flowers[idx-1])
            else:
                res.append(0)
        return res

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

创作打卡挑战赛 赢取流量/现金/CSDN周边激励大奖

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

LeetCode笔记:Weekly Contest 317

LeetCode笔记:Weekly Contest 288

LeetCode笔记:Weekly Contest 299

LeetCode笔记:Weekly Contest 307

LeetCode笔记:Weekly Contest 325

LeetCode笔记:Weekly Contest 314