前言:

每道题附带动态示意图,提供java、python两种语言答案,力求提供leetcode最优解。

描述:

给定一个未排序的整数数组,找出最长连续序列的长度。

要求算法的时间复杂度为 O(n)。

示例:

输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。

思路:

  首先,我们先来看一个简单的例子:序列123 序列 56,插入4,求连续序列长度。

  

  很容易得出结论,答案是6,那么这个6是怎么来的呢?6 = len(1,2,3) + len(5,6) + 1。

  当4插入的时候,我们关心的是3,5,而当序列1,2,3,4,5,6一旦形成,那么元素2,3,4,5我们将不会关心,因为无论新加入序列的元素取何值,都不会和元素2,3,4,5组合成连续序列。

  那么我们是否可以将连续序列的长度,当作一种状态,绑定在连续序列的首尾元素上?

此时,当元素7插入序列后,组成的最大连续序列就是4 = 2+1+1,因此我们可以分析出,该问题的dp方程是 dp[i] = dp[i - 1] + dp[i+1]

我们可以借助散列表来简化时间复杂度。

图解:

java:

class Solution {
public int longestConsecutive(int[] nums) {
int len = nums.length;
int max = 0;
if (len == 0) {
return max;
}
HashMap<Integer, Integer> map = new HashMap<>(len);
for (int i = 0; i < len; i++) {
if (!map.keySet().contains(nums[i])) {
Integer before = map.getOrDefault(nums[i] - 1, 0);
Integer after = map.getOrDefault(nums[i] + 1, 0);
int value = before + after + 1;
max = Math.max(value, max); map.put(nums[i] - before, value); map.put(nums[i] + after, value);
}
}
return max;
}
}

结果:

python:

class Solution(object):
def longestConsecutive(self, nums):
hash_dict = dict() max_length = 0
for num in nums:
if num not in hash_dict:
left = hash_dict.get(num - 1, 0)
right = hash_dict.get(num + 1, 0) cur_length = 1 + left + right
if cur_length > max_length:
max_length = cur_length hash_dict[num] = cur_length
hash_dict[num - left] = cur_length
hash_dict[num + right] = cur_length return max_length

结果:

最新文章

  1. Windows 7系统下删除开机引导项的方法
  2. 喜欢的女生快被别人抢走了,我敢怎么抢? - V2EX
  3. [Kafka] - Kafka Java Consumer实现(一)
  4. 【续】抓个Firefox的小辫子,jQuery表示不背这黑锅,Chrome,Edge,IE8-11继续围观中
  5. vagrant系列教程(一):vagrant的安装与初识(转)
  6. python3全栈开发- 元类metaclass(面试必考题)
  7. OpenCV stereo matching BM 算法
  8. Pandas系列(五)-分类数据处理
  9. 学习笔记78—三大统计相关系数:Pearson、Spearman秩相关系数、kendall等级相关系数
  10. 转://RMAN跨平台可传输表空间和数据库
  11. scss文件使用笔记
  12. A1032. Sharing
  13. Money 20/20 | 未来金融数字化转型:数字化半径与全栈式战略观
  14. codeforces 477D
  15. SQL Script for select data from ebs and make a csv file to FTP
  16. modelsim与debussy联调环境的搭建
  17. Scratch GUI
  18. cygwin下编译zlib源代码
  19. android studio中使用recyclerview制作个显示考勤打卡的日历来
  20. 二叉树学习三:AVL树

热门文章

  1. Win 使用终端创建mysql数据库及使用(5)
  2. 小程序api的promise封装
  3. toString() 方法的参数
  4. scrapy抓取国家社科基金项目数据库
  5. Mysql数据库调优和性能优化的21条最佳实践
  6. 剑指Offer-32.丑数(C++/Java)
  7. 用Spring Security, JWT, Vue实现一个前后端分离无状态认证Demo
  8. CentOS 7 Cobbler 安装
  9. 我的第一个 python 爬虫脚本
  10. Pycharm常见快捷键