最长的连续序列的长度
题目描述
给定无序数组arr,返回其中最长的连续序列的长度(要求值连续,位置可以不连续,例如 3,4,5,6为连续的自然数)
解法一: 排序法
import java.util.*;
public class Solution {
/**
* max increasing subsequence
* @param arr int整型一维数组 the array
* @return int整型
*/
public int MLS (int[] arr) {
// write code here
Arrays.sort(arr);
// 表示i结尾最长上升子序列
int[] dp = new int[arr.length];
dp[0] = 1;
int maxValue = Integer.MIN_VALUE;
for(int i = 1; i < arr.length; i++){
if(arr[i] == arr[i-1]){
dp[i] = dp[i-1];
} else if(arr[i] == arr[i-1] + 1){
dp[i] = dp[i-1] + 1;
} else {
dp[i] = 1;
}
maxValue = Math.max(maxValue, dp[i]);
}
return maxValue;
}
}
使用TreeSet来做
import java.util.*;
public class Solution {
/**
* max increasing subsequence
* @param arr int整型一维数组 the array
* @return int整型
*/
public int MLS2(int[] arr) {
// write code here
Arrays.sort(arr);
// 表示i结尾最长上升子序列
int[] dp = new int[arr.length];
dp[0] = 1;
int maxValue = Integer.MIN_VALUE;
for(int i = 1; i < arr.length; i++){
if(arr[i] == arr[i-1]){
dp[i] = dp[i-1];
} else if(arr[i] == arr[i-1] + 1){
dp[i] = dp[i-1] + 1;
} else {
dp[i] = 1;
}
maxValue = Math.max(maxValue, dp[i]);
}
return maxValue;
}
public int MLS (int[] arr) {
TreeSet<Integer> set =new TreeSet<> ();
// -------------------------------
for(int i = 0; i < arr.length; i++){
set.add(arr[i]);
}
// 类似的思路使用双指针;
// 第一个指针指向第一个,第二个指针指向第二个
Iterator<Integer> it = set.iterator();
int cnt = 1;
int maxCnt = 1;
int prev = it.next();
while(it.hasNext()){
int value = it.next();
if(value == prev)
continue;
else if(value == prev + 1){
cnt ++;
maxCnt = Math.max(cnt, maxCnt);
} else{
cnt = 1;
}
prev = value;
}
return maxCnt;
}
}
可以使用并查集做,没有写完。
class UnionSet{
int[] fa = new int[100000];
int[] rank = new int[100000];
UnionSet(int[] arr){
}
int find(int k){
return fa[k] == k ? k : (fa[k] = find(fa[k]));
}
int merge(int x, int y){
}
}