代码改变世界

[LeetCode] 128. Longest Consecutive Sequence_Hard tag: Hash 思路:记忆化搜索

2019-05-16 07:31  Johnson_强生仔仔  阅读(281)  评论(0编辑  收藏  举报

Given an unsorted array of integers, find the length of the longest consecutive elements sequence.

Your algorithm should run in O(n) complexity.

Example:

Input: [100, 4, 200, 1, 3, 2]
Output: 4
Explanation: The longest consecutive elements sequence is [1, 2, 3, 4]. Therefore its length is 4.

这个题目就利用hash table,python中用set来表示,s1是整个nums的hash table,s2记录visited num。然后for num in nums,每个num看看是否被visited过,其实有点DFS的思路,如果没有被visited过,将其标记为visited,然后两个while loop分别找比num大的和小的连续的数,最后将ans和count进行比较,最后返回ans即可。

Code:T: O(n),   S:O(n)

class Solution:
    def longestConsecutiveSequence(self, nums: List[int]) -> int:
        ans, s1, s2 = 0, set(nums), set()
        for num in nums:
            if num in s2:
                continue
            count, temp = 1, num
            while (num + 1 in s1 and num + 1 not in s2):
                s2.add(num + 1)
                count += 1
                num += 1
            num = temp
            while (num - 1 in s1 and num - 1 not in s2):
                s2.add(num - 1)
                count += 1
                num -= 1
            ans = max(ans, count)
        return ans

 

利用hash 和divide and conquer 的概念来做。 T: O(n), S: O(n)

Code

class Solution:
    def longestConsecutiveSeq(self, nums):
        ans, numsSet, visited = 0, set(nums), set()
        def helper(num):
            if num in numsSet and num not in visited:
                visited.add(num)
                left = helper(num - 1)
                right = helper(num + 1)
                return left + right + 1
            return 0
        for num in nums:
            ans = max(ans, helper(num))
        return ans

 

Code

class Solution:
    def longestConsecutiveSeq(self, nums):
        ans, numsSet, d, visited = 0, set(nums), {}, set()
        def helper(num):
            if num in d:
                return d[num]
            if num in numsSet and num not in visited:
                visited.add(num)
                left = helper(num - 1)
                right = helper(num + 1)
                d[num] = left + right + 1
                return d[num]
            return 0
        for num in nums:
            ans = max(ans, helper(num))
        return ans