(三)最长连续序列

文章讨论了如何在不使用排序的情况下,利用O(n)的时间复杂度找到给定未排序整数数组中数字连续的最长序列。作者首先尝试了冒泡排序,但意识到其效率过低,然后转向记忆化搜索的动态规划方法,提供了一个解决方案。
摘要由CSDN通过智能技术生成

题目:给定一个未排序的整数数组 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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值