描述
给定无序数组arr,返回其中最长的连续序列的长度(要求值连续,位置可以不连续,例如 3,4,5,6为连续的自然数)
解题
Solution1
/**
*求数组中最长的连续子序列
* 集合方法求解
*/
import java.util.HashSet;
import java.util.Set;
public class Solution {
public int MLS(int[] arr){
if (arr.length==0) return 0;
int max=1;
Set<Integer> set = new HashSet<>(); //定义集合
for (int num:arr){
set.add(num);//将数据加载进集合
}
for (int num:arr){
if (set.contains(num-1)) continue;//查找连续子序列的头
int start = num;
while (set.contains(start+1)){
start++;//计算连续子序列的长度
}
max=Math.max(max,start-num+1);
}
return max;
}
}
Solution2
/**
*求数组中最长的连续子序列
* 数组排序方法求解
*/
import java.util.Arrays;
public class Solution2 {
public int MLS(int[] arr){
if (arr.length==0) return 0;
Arrays.sort(arr);//调用数组排序函数
int count=1;
int result=1;
for (int i = 0; i < arr.length-1; i++) {
if(arr[i+1]-arr[i]==1){
count++;//连续子序列的长度
}else if (arr[i+1]-arr[i]==0){
continue;
}else {
count=1;//更新连续子序列
}
result=Math.max(result,count);
}
return result;
}
}
Solution3
/**
*求数组中最长的连续子序列
* 哈希表方法求解
* 表的键即元素值,表键值即自身所在连续子序列的长度
*/
import java.util.HashMap;
public class Solution3 {
public int MLS(int[] arr){
if (arr.length==0) return 0;
HashMap<Integer,Integer> map=new HashMap<>();//哈希表
int max=0;
for(int num:arr){
if(!map.containsKey(num)){//存入表
int prelen=map.get(num-1)==null? 0:map.get(num-1);//若左边连续则返回左边连续子序列的长度
int nexlen=map.get(num+1)==null? 0:map.get(num+1);//若右边连续则返回右边连续子序列的长度
int curlen=prelen+1+nexlen;//当前连续子序列的长度
map.put(num,curlen);
max=Math.max(max,curlen);//求最长子序列
map.put(num-prelen,curlen);//更新序列头
map.put(num+nexlen,curlen);//更新序列尾
}
}
return max;
}
}