leetcode 817

这题思路挺简单,但是我Error了太多次!!首先我想就是记录每个数字的后面一个数字,然后类似于跳着查找这样的方式,将走过的数字的标志变为1,直到结束,后来超时了。突然发现与顺序无关,那么如果在G中标志为1,不在G中标志为0,不就变成找一个列表当中有多少个1的团吗。后来结果又超时了,我还以为是用了两个独立的循环导致的,最后把他们写在一起,结果还是超时。我TM就纳闷了,为啥我复杂度都是O(n)你这个还是超时!!!!结果突然发现not in 和 in 这两个操作!!哇,难受!后来我就典型地牺牲空间换时间地方式,通过弄一个大的list来判断是不是在了。附代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def numComponents(self, head, G):
        """
        :type head: ListNode
        :type G: List[int]
        :rtype: int
        """
        GG = []
        pos = []
        h = []
        while head!= None:
            h.append(head.val)
            head = head.next
        head = h
        
        visited = [0] * len(head)
        for i in range(len(head)):
            val = head[i]
            if val in G:
                GG.append(val)
                if i == len(head) - 1:
                    pos.append(-1)
                else:
                    pos.append(head[i+1])
        count = 0
        for i in range(len(GG)):
            if visited[GG[i]] == 1:
                continue
            val = GG[i]
            visited[val] = 1
            count += 1
            j = i
            while visited[pos[j]] == 0 and pos[j] in GG:
                visited[pos[j]] = 1
                j = GG.index(pos[j])
        return count
            
            
            
            
            
            
            
            
            
            
            
            
            
           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值