题目意思:找出最长的连续子序列,在原数组中,这些元素的位置不一定相邻,也不一定按照大小顺序排列,如示例1中[4,1,3,2]为连续子序列,但是它们不相邻并且没有排序。
1、对数组进行排序,找出其中最大的连续序列
import java.util.*;
public class Solution {
/**
* max increasing subsequence
* @param arr int整型一维数组 the array
* @return int整型
*/
public int MLS (int[] arr) {
//进行排序
Arrays.sort(arr);
//
int res = 1;
int counter = 1;
for(int i = 1; i < arr.length; i++) {
if(arr[i] == arr[i-1]) {
continue;
}
if(arr[i] - arr[i-1] == 1) {
counter++;
} else {
counter = 1;
}
res = Math.max(res,counter);
}
return res;
}
}
2、借助set集合。先把所有的元素加入set集合中,然后遍历数组,如果当前元素减一的值在set集合中,说明当前元素一定不是最长序列的起始值,如果当前元素减一没有包含在set集合中,则当前元素可能是最长序列的起始值,以当前元素为起点,查找其连续长度。
public int MLS(int[] arr) {
//先把数组放到集合set中
Set<Integer> set = new HashSet<>();
for (int num : arr)
set.add(num);
int longest = 0;//记录最长的有序序列
for (int num : arr) {
//这里要找有序序列最小的元素(不一定是最长
//有序序列的)。如果还有更小的,说明当前元素
//不是最小的,直接跳过
if (set.contains(num - 1))
continue;
//说明当前元素num是当前序列中最小的元素(这里
//的当前序列不一定是最长的有序序列)
int currentNum = num;
//统计当前序列的长度
int count = 1;
while (set.contains(currentNum + 1)) {
currentNum++;
count++;
}
//保存最长的值
longest = Math.max(longest, count);
}
return longest;
}
因篇幅问题不能全部显示,请点此查看更多更全内容