题目:给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例 1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例 2:
输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9
当看到这个题目时,我的初步想法就是先用排序算法将数组中所有元素进行排序,然后再判断排序后的数组中的连续最长序列,但是题目中要求时间复杂度为O(n),在排序算法中我喜欢用冒泡排序,但其时间复杂度为O(n*n),即使是时间复杂度最小的快速排序算法也是O(nlogn),所以在这里不能使用这种方法。(也不知道能不能实现出来)
以下是我的想法代码:
import java.util.Arrays;
import java.util.Scanner;
public class changeNum{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); //输入
System.out.print("输入数组大小:");
int n = scanner.nextInt();
int[] nums = new int[n]; // 创建一个大小为 n 的整数数组
int countNum=0;
System.out.println("请输入整数:");
for (int i = 0; i < n; i++) {
nums[i] = scanner.nextInt();
}
for (int i = 0; i < n; i++) {
// 每轮遍历将最大的数移到末尾
for (int j = 0; j < n - i - 1; j++) {
if (nums[j] > nums[j+1]) {
int temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
}
System.out.println(Arrays.toString(nums));
for (int i=0; i<n; i++){
if(nums[i]+1 == nums[i+1]){
countNum++;
}
}
}
}
然后我参考了另一个博主,他讲的也非常细致128最长连续序列
以下就是我在leetcode提交的正确代码啦!
class Solution {
public:
// 记忆化搜索 返回的结果是以v为起点的最长路的长度
int dfs(unordered_map<int, int>& mp, int v){
// 如果v不在集合中,就直接返回0,代表以v为起点的路长度为0
if (mp.find(v) == mp.end())
return 0;
// 如果这个节点已经搜索一遍了,直接返回结果
if (mp[v] != 0)
return mp[v];
// 如果当前节点还没有结果,
// 我们就去询问v+1为起点的最长路长度, 并+1得到自身的答案
// 并记录结果
return mp[v] = dfs(mp, v+1) + 1;
}
int longestConsecutive(vector<int>& nums) {
// mp[v] 表示以v为起点的最长路的长度
unordered_map<int, int> mp;
// 将数据插入mp并进行初始化
for (auto v: nums)
mp[v] = 0;
int ans = 0;
// 对每个元素进行记忆化搜索
for (auto v: nums){
ans = max(ans, dfs(mp, v));
}
return ans;
}
};