题目:最长连续数
给定一个未排序的整数数组 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
暴力操作(已超时)
public static int longestConsecutive(int[] nums) {
if(nums.length==0) return 0;
// 思路:冒泡排一下序,然后循环比较 nums[i+1]-nums[i]==1
for (int i = 0; i < nums.length-1; i++) {
for (int j = i+1; j <nums.length ; j++) {
if(nums[i]>nums[j]) {
int temp = nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}
}
int max=-1;
int temp=1;
for (int i = 0; i < nums.length-1; i++) {
if(nums[i+1]==nums[i]) continue;
if(nums[i+1]-nums[i]==1) {
temp++;
}else {
if(temp>max) {
max=temp;
}
temp=1;
}
}
if(temp>max) max=temp;
return max;
}
hash方法
思路:
通过set集合,判断集合中有无 value-1的值是否存在,如果没有,将当前数据保存,遍历所有集合数据,判断有无当前数+1的value存在,一直循环,定义一个统计数值,longestStreak,与max进行最大值比较得出结果
public static int longestConsecutive(int[] nums) {
// 创建一个set集合,无序,不可重复,将数组存入集合中,自动去重
Set<Integer> set = new HashSet<>();
for(int num : nums) {
set.add(num);
}
// 定义一个参数,为返回值,防止[]的出现,初始化参数为0;
int max = 0;
// 通过set集合,判断集合中有无 value-1的值是否存在,如果没有,将当前数据保存,遍历所有集合数据,判断有无
// 当前数+1的value存在,一直循环,定义一个统计数值,longestStreak,与max进行最大值比较得出结果
for(int num :set) {
if(!set.contains(num-1)) {
int current = num;
int longestStreak=1;
while(set.contains(current+1)) {
current+=1;
longestStreak+=1;
}
max = Math.max(max,longestStreak);
}
}
return max;
}
解决问题花费时间 : 1 h (花费时间太长了)