问题描述:
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例2:
输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9
解题思路:动态规划
- 数组去重。这一操作不会影响最终结果,但长度可能会减小,因此运行效率变高
- 排序
- 定义数组dp,dp[i]表示以第i个元素结尾的数字连续最长序列长度,
- 确定状态转移方程(这里temp表示排序后的数组)
代码实现(js)
/**
* @param {number[]} nums
* @return {number}
*/
var longestConsecutive = function(nums) {
// 0.边界值判断
if(nums.length < 1) return []
// 1.去重,不影响最后结果,且数组长度可能会减小,因此运行效率会变高
let temp = [...new Set(nums)]
// 2.排序
temp.sort((a, b) => {
return a - b
})
// 3.定义dp
let dp = new Array(temp.length).fill(1)
for(let i = 1; i < temp.length; i++){
if(temp[i - 1] + 1 === temp[i]){
dp[i] = dp[i - 1] + 1
}else{
dp[i] = 1
}
}
return Math.max.apply(null, dp)
};