【LeetCode128】最长连续序列(unordered_map+dfs-记忆化搜索)

简介: 初级解法:用sort排序和用unique去重后for循环遍历一遍数组,如果当前和上一个数字之差为1,则count累加1;如果当前数字和上一个数字之差不为1,则重新设count为1计算。

1.题目

https://leetcode-cn.com/problems/longest-consecutive-sequence/solution/ti-mu-fen-xi-ji-yi-hua-sou-suo-bing-cha-ji-ji-lu-d/

image.png


2.法一:用sort

初级解法:用sort排序和用unique去重后for循环遍历一遍数组,如果当前和上一个数字之差为1,则count累加1;如果当前数字和上一个数字之差不为1,则重新设count为1计算。


为啥要去重呢:题目说的数字连续的最长序列,如第二个组测试用例,0012345678,就不包括重复的0了,而是从0到8计数。


复杂度:没达到O(n)的时间复杂度——因为用了sort排序,时间复杂度是O(nlog n)。

 class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        if(nums.size()==0)
            return 0;
        sort(nums.begin(),nums.end());//从小到大排序
        auto quchong=unique(nums.begin(),nums.end());//去重
        //一次for遍历即可
        int a=0,max=1,count=1;
        for(int i=1;i<nums.size();i++){
            if(nums[i]-nums[a++]==1){
                count++;//符合连续序列的元素个数
                //a++;
            }else{
                count=1;//重新计为1个
                //a++;
            }
            if(count>max){
                max=count;
            }
        }
        return max;//元素个数
    }
};

3.法二:dfs-记忆化搜索

不能用set或map等基于树的容器(容器的插入与查找时间复杂度为额为logn),只能执行常数次的插入或查找。


有向无环图求最长路:对于每个v都指向v+1。mp[v]表示以v为起点的最长路的长度,所以可以得出递归式:m p [ i n d e x ] = m p [ i n d e x + 1 ] + 1 mp[index]=mp[index+1]+1mp[index]=mp[index+1]+1,而递归边界:哈希表中以index为key值的value为0时,则m p [ i n d e x ] = 0 mp[index]=0mp[index]=0。


注意unordered_map底层是hash表,map底层是红黑树。

class Solution {
private:
    unordered_map<int,int>mp;
public:
    int dfs(int index){//求以index为起点的最长路长度
        if(mp.find(index)==mp.end()){//若不在
            return 0;
        }
        if(mp[index]!=0){
            return mp[index];
        }
        return mp[index]=dfs(index+1)+1;
    }
    int longestConsecutive(vector<int>& nums) {
        if(nums.size()==0)
            return 0;
        for(auto i:nums){
            mp[i]=0;//加入key值,并初始化value
        }
        int ans=0;
        for(auto i:nums){
            if(ans < dfs(i)){
                ans=dfs(i);
            }
        }
        return ans;
    }
};


相关文章
|
4月前
|
Python
【Leetcode刷题Python】376. 摆动序列
文章提供了解决LeetCode "摆动序列" 问题的Python实现代码,通过遍历整数数组并使用两个变量 down 和 up 来记录正差和负差摆动序列的长度,最终返回最长摆动子序列的长度。
41 0
|
2月前
|
算法 索引
LeetCode(搜索插入位置)
如何使用二分查找算法来解决LeetCode上的“搜索插入位置”问题,确保时间复杂度为O(log n),并提供了详细的代码实现和分析。
15 2
|
2月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
19 0
Leetcode第三十三题(搜索旋转排序数组)
|
2月前
【LeetCode 39】700.二叉搜索树中的搜索
【LeetCode 39】700.二叉搜索树中的搜索
16 0
|
4月前
|
算法
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II
|
4月前
|
算法
LeetCode第74题搜索二维矩阵
文章讲解了LeetCode第74题"搜索二维矩阵"的解决方案,利用二分搜索法将问题简化,并通过数学转换找到二维矩阵中的对应元素,展示了将二维问题转化为一维问题的解题技巧。
LeetCode第74题搜索二维矩阵
|
4月前
|
算法
LeetCode第35题搜索插入位置
这篇文章介绍了LeetCode第35题"搜索插入位置"的解题方法,通过使用二分查找法,高效地找到在有序数组中插入一个目标数的最佳位置。
LeetCode第35题搜索插入位置
|
4月前
|
算法
LeetCode第33题搜索旋转排序数组
这篇文章介绍了LeetCode第33题"搜索旋转排序数组"的解题方法,通过使用二分查找法并根据数组的有序性质调整搜索范围,实现了时间复杂度为O(log n)的高效搜索算法。
LeetCode第33题搜索旋转排序数组
|
4月前
|
Python
【Leetcode刷题Python】946. 验证栈序列
LeetCode题目“946. 验证栈序列”的Python解决方案,通过模拟栈的压入和弹出操作来验证给定的两个序列是否能通过合法的栈操作得到。
30 6
|
4月前
|
算法 JavaScript Python
【Leetcode刷题Python】79. 单词搜索和剑指 Offer 12. 矩阵中的路径
Leetcode第79题"单词搜索"的Python解决方案,使用回溯算法在给定的二维字符网格中搜索单词,判断单词是否存在于网格中。
43 4