817. 链表组件(哈希表)

85 阅读3分钟

image.jpeg

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目提示

    • 链表中节点数为n
    • 1 <= n <= 104
    • 0 <= Node.val < n
    • Node.val 中所有值 不同
    • 1 <= nums.length <= n
    • 0 <= nums[i] < n
    • nums 中所有值 不同

二、思路分析:

我们今天拿到本题是 leetcode 难度为中等题 817. 链表组件。题目要求在链表中,找到能组成nums列表的组件,返回组件个数。什么是组件?

  • 组件是链表中一段连续的结点的值构成的集合,同时该结点值在nums列表中的
  • 链表中要找到构成nums的结点集合,存在对照关系,可以引入哈希表提前处理
  • 判断链表中的组件情况,需要判断结点的值在nums中且前一个结点不存在nums中;

根据题目内容,我们可以使用哈希表的方式来构建映射关系解答本题,思路如下:

  • 方法一:列表索引构建哈希

    • nums的值需要提前记录存在与否的关系,可以使用索引排序方式
    • 需要提前把nums的元素在长度为10^4的临时列表indexlist中,转换成indexlist[num]==1的关系,其他索引位置赋值为0
    • 同时引入pre变量记录head前一个节点的值在nums状态,初始化为0
    • 遍历整个链表,当per为0,且indexlist[head.val]值为1时,则为一个组件,组件次数ans+1
    • pre指针值更新为indexlist[head.val],head指针继续向右移动,直到head为空结点退出循环
    class Solution(object):
        def numComponents(self, head, nums):
            """
            :type head: ListNode
            :type nums: List[int]
            :rtype: int
            """
            indexlist = [0]*10001
            for num in nums: 
                indexlist[num] = 1
            ans,pre = 0,0
            while head:
                if pre == 0 and indexlist[head.val] == 1:ans +=1
                pre = indexlist[head.val]
                head = head.next
            return ans
    
  • 方法二:集合构建哈希

    • 本题需要找到组件的次数,因此只需要找到一段连续结点中出现nums中不存在的结点情况
    • 我们只需要使用set()对nums列表进行除去重复元素即可,并将pre的值初始化False状态
    • 遍历整个链表,当head.val不存在集合中,pre值更新为False
    • 当head.val存在集合,并且组件次数ans+1,同时将pre值更新为True
    class Solution(object):
        def numComponents(self, head, nums):
            numset = set(nums)
            pre = False
            ans = 0
    
            while head:
                if head.val not in numset:
                    pre = False
                elif not pre:
                    ans +=1
                    pre = True
                head = head.next
            return ans
    

三、总结:

本题是一道关于链表找集合的问题,需要理清题目要求是一段连续的node节点,因此借助一个状态值pre来存储head指针所指的节点值在nums的存在状态来进行判断,前提可以使用哈希表来创建对照关系,AC提交记录如下:

image.png

  • 时间复杂度:O(n),需要遍历链表
  • 空间复杂度:O(n),需要创建链表长度的列表空间

以上是本期内容,欢迎大佬们点赞评论,下期见~~~