LeetCode解题 Day01

565. Array Nesting

https://leetcode.com/problems/array-nesting/


题目介绍:

你会得到一个长度是n,范围是[0 ~ n-1]的 nums
并且要组合一个集合 s[k] = {nums[k], nums[nums[k]], nums[nums[nums[k]]], ... }
详细规则我们以Example 1 解释

Example 1:

https://i.imgur.com/8aBtSQX.png

一开始的集合是 s[0] ,我们第一个元素就是 nums[0] = 5 ,第二个元素则是 nums[5] = 6 ,以此类推直到 nums[i] 等於 0。

而我们的任务是回传最长的 s[k] 的长度


解法1:

这题的难度是Medium,不过其实蛮简单的,很快就能想到硬干的方法

只要照字面意思run过每个集合,并回传最大的长度就好

但是,这种解法遇到长度很长的测试案例就会超过时间了,送出去会显示 Time Limit Exceeded。

程序码:

class Solution:
    def arrayNesting(self, nums: List[int]) -> int:
    
        res = 0
        
        for i in range(len(nums)):
            count = 1
            j = nums[i]
            while nums[j] != nums[i]:
                j = nums[j]
                count += 1
            
            res = max(count, res) #纪录最大的长度
            
        return res

解法修改:

上一个解法是因为我们会重复计算好几个过程

像是 example1 中的 s[0] = {nums[0], nums[5], nums[6], nums[2]} = {5, 6, 2, 0}

我们可以知道 k = 0 时集合为长度4的 {5,6,2,0}

那我们就可以知道 k5, 6, 2, 0时,就都是长度为4的集合,就像下图绕圈圈的这种感觉
https://i.imgur.com/MPhIh7i.png

那我们就没必要重复run过 k=5, k=6, k=2 了

程序码:

class Solution:
    def arrayNesting(self, nums: List[int]) -> int:
        
        res = 0
        visted = set()
        
        for i in range(len(nums)):
            
            if nums[i] in visted:
                continue
            
            count = 1
            j = nums[i]
            while nums[j] != nums[i]:
                visted.add(j) #记录可以省略的数字
                j = nums[j]
                count += 1
            
            res = max(count, res)
            
        return res

闲聊:

今天是第一天,刚好遇到简单好讲解的题目

LeetCode题目虽然都有区分难度 easy medium hard

但是我觉得有时候 medium 的题目比一些 easy 题目简单,有时候 easy 题目要多想一下

个人认为比较准确区分题目难易度的分法是看题目左上角的正赞倒赞比例

感觉倒赞比较多的题目就有点麻烦,像是今天这题的正赞比就超过9成


<<:  数位变革

>>:  Day 0:拼错的果汁

Day 19: Behavioral patterns - Command

目的 将行为拆成请求与执行两个区块,请求的部分独自封装成物件,执行的部分则交由专门负责执行的物件。 ...

【Side Project】 菜单内容3-画面资料绑定

上一篇我们已经能够从我们资料库上抓出我们建立的菜单了, 这篇会跟大家一起把我们抓出来的画面显示在网页...

AI 未来狂想

人的科技文明发展始终来自於人性 藉由现在的科技技术之发展,我们可以非常成熟的运用机器学习、深度学习及...

[Day15]程序菜鸟自学C++资料结构演算法 – 二元树的基本应用

前言:介绍完了二元树的建立和走访方式,紧接着要来介绍其他基本应用,一样用上一篇的程序码进行修改 可以...

Day 3: 我不想知道的太多,以免被连累.单一职责与最小知道原则

Keyword: 单一职责 最小知道 单一职责与最小知道 在MVVM中,单一职责与最小知道原则是非常...