LeetCode笔记:Weekly Contest 304

Posted Espresso Macchiato

tags:

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

0. 小结

这一周的四道题倒是挺顺利地就搞定了,不过鉴于第一名也就花了5分钟,实在是也没啥成就感……

最近一段时间可能真的比较凌乱吧,房子快要到期了,然后忙忙碌碌地找新室友,公司里面也是刚好轮到on call,各种报警烦的一塌糊涂……

唯一的好消息大概就是最近终于重新做了一些模型方面的优化,不过时间紧任务重,结果方面目前还没有什么太过拿得出手的结果,不过总算能写代码就算是比较幸福的事情了……

anyway,算是自己发发牢骚吧,忘了在哪看到过说这世上其实没有长大这么一回事,说白了其实就是确实地认识到所有的事都需要自己来兜底了,所以发牢骚归发牢骚,抱怨过后一切依然照旧,总不能因为心累就放弃努力了吧,那就真的啥希望都没了……

1. 题目一

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

1. 解题思路

这一题只要对数字进行去重,然后找到所有的非零数字的个数即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def minimumOperations(self, nums: List[int]) -> int:
        nums = set(nums)
        n = len(nums)
        return n if min(nums) != 0 else n-1

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

2. 题目二

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

1. 解题思路

这一题事实上我们可以给出一个万能的数列构造方法,即:

  • 我们对所有的数字进行从小到大有序排列,然后依次取1、2、3…个元素,直至无法取满元素之后将剩余的元素加入到最后一个堆之中。

由上述构造方法,我们总能够完成目标构造,且上述构造方式能够构造的堆一定是最多的。

因此,假设总元素个数为n,那么我们只需要找到一个最大的x,使得满足下式即可。

x ( x + 1 ) 2 ≤ n \\fracx(x+1)2 \\leq n 2x(x+1)n

这就变成一道初中数学题目了……

2. 代码实现

给出python代码实现如下:

class Solution:
    def maximumGroups(self, grades: List[int]) -> int:
        n = len(grades)
        return int((math.sqrt(8*n+1)-1) / 2)

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

3. 题目三

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

1. 解题思路

这一题的话细节上其实有蛮多需要考察的特殊情况的,比如是否成环,是否联通等等,如果一开始没注意到这些的话还是比较容易答错的。不过我们可以给出一个较为一般的思路,从而使得无需对上述特殊情况进行考察。

具体而言,我们只要分别以两个node作为起点,然后考察所有其能够往后经历到达的点(到循环或者终点结束),记录下其距离,然后比较两个距离之中的较大值即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def closestMeetingNode(self, edges: List[int], node1: int, node2: int) -> int:
        n = len(edges)
        
        dis1 = [math.inf for _ in range(n)]
        dis = 0
        while edges[node1] != -1 and dis1[node1] == math.inf:
            dis1[node1] = dis
            dis += 1
            node1 = edges[node1]
        if dis1[node1] == math.inf:
            dis1[node1] = dis
        
        dis2 = [math.inf for _ in range(n)]
        dis = 0
        while edges[node2] != -1 and dis2[node2] == math.inf:
            dis2[node2] = dis
            dis += 1
            node2 = edges[node2]
        if dis2[node2] == math.inf:
            dis2[node2] = dis

        dis = math.inf
        res = -1
        for i in range(n):
            if max(dis1[i], dis2[i]) < dis:
                dis = max(dis1[i], dis2[i])
                res = i
        return res

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

4. 题目四

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

1. 解题思路

这一题和上一题的思路基本是一脉相承的,只需要以每一个点作为起点考察一下其是否成环,然后成环的话这个环的长度是多少,然后取出一个最大值即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def longestCycle(self, edges: List[int]) -> int:
        n = len(edges)
        dis = [-1 for _ in range(n)]
        res = -1
        for i in range(n):
            if dis[i] != -1:
                continue
            d = 0
            path = set()
            while edges[i] != -1 and dis[i] == -1:
                path.add(i)
                dis[i] = d
                i = edges[i]
                d += 1
            if i in path:
                res = max(res, d-dis[i])
        return res

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

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

LeetCode笔记:Weekly Contest 317

LeetCode笔记:Weekly Contest 288

LeetCode笔记:Weekly Contest 299

LeetCode笔记:Weekly Contest 307

LeetCode笔记:Weekly Contest 325

LeetCode笔记:Weekly Contest 314