力扣题目
解题思路
java代码
力扣题目:
给定一个未排序的整数数组 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
解题思路:
算法原理:
- 通过将数组中的元素放入哈希集合中,利用哈希集合快速查找和判断元素是否存在,然后依次对每个元素进行探索其连续递增序列。
思路:
- 首先,将数组中的所有元素添加到哈希集合中。然后,遍历数组中的每个元素。如果当前元素的前一个元素不存在于哈希集合中,就从当前元素开始向后探索连续递增的元素,计算连续长度,并更新最大长度。
代码分析:
- 先创建一个哈希集合
numSet
并将数组元素添加进去。 - 在遍历数组时,对于每个元素,如果它的前一个元素不在集合中,就开始向后找连续的元素,通过不断递增当前元素并判断是否在集合中来计算连续长度,每次更新最大长度。
时间复杂度:,虽然有内层的循环,但整体上每个元素最多只被处理一次。
空间复杂度:,用于存储哈希集合。
java代码:
package org.example.mouth7.today23;
import java.util.HashSet;
public class Leetcode128 {
public static void main(String[] args) {
int[] nums = {100,4,200,1,3,2};
System.out.println(longestConsecutive(nums));
}
public static int longestConsecutive(int[] nums) {
HashSet<Integer> numSet = new HashSet<>();
for (int num : nums) {
numSet.add(num);
}
int max = 0;
for (int num : nums) {
if (!numSet.contains(num - 1)) {
int currentNum = num;
int currentLength = 1;
while (numSet.contains(currentNum + 1)) {
currentNum++;
currentLength++;
}
max = Math.max(max, currentLength);
}
}
return max;
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项