0
点赞
收藏
分享

微信扫一扫

数组中的最长连续子序列

截止到目前我已经写了 600多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
下载链接:​​https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ​​提取码:6666

数组中的最长连续子序列_数组
数组中的最长连续子序列_算法_02
数组中的最长连续子序列_算法_03

public int MLS(int[] arr) {
if (arr == null || arr.length == 0)
return 0;
int longest = 1;//记录最长的有序序列
int count = 1;//目前有序序列的长度
//先对数组进行排序
Arrays.sort(arr);
for (int i = 1; i < arr.length; i++) {
//跳过重复的
if (arr[i] == arr[i - 1])
continue;
//比前一个大1,可以构成连续的序列,count++
if ((arr[i] - arr[i - 1]) == 1) {
count++;
} else {
//没有比前一个大1,不可能构成连续的,
//count重置为1
count = 1;
}
//记录最长的序列长度
longest = Math.max(longest, count);
}
return longest;
}

时间复杂度:​​O(nlog(n))​​​,排序的复杂度是​​nlog(n)​​​,​​for​​​循环是​​n​​​,相加是​​nlog(n)+n​​​,所以时间复杂度是​​nlog(n)​​。

空间复杂度:​​O(1)​​,就使用两个变量

数组中的最长连续子序列_最长连续子序列_04

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;
}

时间复杂度:​​O(n)​​​,​​for​​​循环是​​n​​​,只有遇到有序序列最小元素的时候才会执行​​while​​里面的循环。

空间复杂度:​​O(n)​​​,使用集合​​set​​存储数组中的所有元素


举报

相关推荐

0 条评论