### 128. Longest Consecutive Sequence

题目:
<https://leetcode.com/problems/longest-consecutive-sequence/>


难度:

Hard


### 思路
首先去重复，时间```O(N)```,然后将所有元素都放到一个字典中，这样判断一个数字的后续在不在这个字典中，如果存在就一直判断下去，每次判断只要```O(1)```。

对于每个数，如果他的前续已经判断过了，他就没有必要判断了，继续判断下一个数，即：
```
if num - 1 in nums:
    continue
```


AC代码：

```python
class Solution(object):
    def longestConsecutive(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        nums = set(nums)
        tmp = {}
        for num in nums:
            tmp[num] = 1
        res = 0
        for num in nums:
            if num - 1 not in nums:
                y = num + 1
                while y in nums:
                    y += 1
                res = max(res, y - num)
        return res
```

但其实```set```和字典的```in```判断都是```O(1)```

```dict```与```set```实现原理是一样的，都是将实际的值放到```list```中。唯一不同的在于hash函数操作的对象，对于```dict```，```hash```函数操作的是其```key```，而对于```set```是直接操作的它的元素，假设操作内容为```x```，其作为因变量，放入```hash```函数，通过运算后取```list```的余数，转化为一个```list```的下标，此下标位置对于```set```而言用来放其本身，而对于```dict```则是创建了两个```list```，一个```list```该下表放此```key```，另一个```list```中该下标方对应的```value```。参考[python dict与set 的实现](http://www.cnblogs.com/pengsixiong/p/5326893.html)

　　其中，我们把实现set的方式叫做Hash Set，实现dict的方式叫做Hash Map/Table(注：map指的就是通过key来寻找value的过程)

```set```和```dict```的唯一区别仅在于没有存储对应的```value```，但是，```set```的原理和```dict```一样，所以，同样不可以放入可变对象，因为无法判断两个可变对象是否相等，也就无法保证```set```内部“不会有重复元素”。

因此，代码也可以写成这样
```python
class Solution(object):
    def longestConsecutive(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        nums = set(nums)
        res = 0
        for num in nums:
            if num - 1 not in nums:
                y = num + 1
                while y in nums:
                    y += 1
                res = max(res, y - num)
        return res
```
