ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

LeetCode hot100——128.最长连续序列

LeetCode hot100——128.最长连续序列 题目给定一个未排序的整数数组 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示例 3输入nums [1,0,1,2]输出3提示0 nums.length 105-109 nums[i] 109题解class Solution { public int longestConsecutive(int[] nums) { SetInteger nums_set new HashSetInteger(); for(int num : nums){ nums_set.add(num); } int maxLength 0; for(int num : nums_set){ if(!nums_set.contains(num - 1)){ int currentNum num; int currentLength 1; while(nums_set.contains(currentNum 1)){ currentNum 1; currentLength 1; } maxLength Math.max(currentLength,maxLength); } } return maxLength; } }思路核心思想寻找“连续序列的起点”如果我们要找连续序列比如 [1, 2, 3, 4]我们不需要从 2、3 或 4 开始往后数我们只需要从序列的起点即 1开始往后数即可。如何判断一个数字是起点如果 num 是起点那么它的前一个数字 num - 1 一定不在数组中。这个判断条件完美地避免了重复计算保证了算法的 O(n) 复杂度。步骤第一步哈希去重预处理将数组中的所有元素存入 HashSet。这一步不仅自动去除了重复元素还将后续查找某个数字是否存在的时间复杂度降为了 O(1) 。第二步寻找起点遍历哈希表中的每一个数字 num。通过判断 num - 1 是否存在于集合中来确认 num 是否为一个连续序列的起点。第三步向后延伸并更新最大值一旦确认 num 是起点就进入 while 循环不断检查 num 1、num 2... 是否存在同时累加当前序列长度。遍历结束后用该长度更新全局最长长度 maxLength。
返回列表