截止到目前我已经写了 600多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
下载链接:https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ
提取码:6666
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)
,就使用两个变量
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
存储数组中的所有元素