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


相关文章
|
19天前
|
Go
【LeetCode 热题100】DP 实战进阶:最长递增子序列、乘积最大子数组、分割等和子集(力扣300 / 152/ 416 )(Go语言版)
本文深入解析三道经典的动态规划问题:**最长递增子序列(LIS)**、**乘积最大子数组** 和 **分割等和子集**。 - **300. LIS** 通过 `dp[i]` 表示以第 `i` 个元素结尾的最长递增子序列长度,支持 O(n²) 动态规划与 O(n log n) 的二分优化。 - **152. 乘积最大子数组** 利用正负数特性,同时维护最大值与最小值的状态转移方程。 - **416. 分割等和子集** 转化为 0-1 背包问题,通过布尔型 DP 实现子集和判断。 总结对比了三题的状态定义与解法技巧,并延伸至相关变种问题,助你掌握动态规划的核心思想与灵活应用!
44 1
|
19天前
|
分布式计算 算法 Go
【LeetCode 热题100】BFS/DFS 实战:岛屿数量 & 腐烂的橘子(力扣200 / 994 )(Go语言版)
本文讲解了两道经典的图论问题:**岛屿数量(LeetCode 200)** 和 **腐烂的橘子(LeetCode 994)**,分别通过 DFS/BFS 实现。在“岛屿数量”中,利用深度或广度优先搜索遍历二维网格,标记连通陆地并计数;“腐烂的橘子”则采用多源 BFS,模拟腐烂传播过程,计算最短时间。两者均需掌握访问标记技巧,是学习网格搜索算法的绝佳实践。
49 1
|
19天前
|
Go
【LeetCode 热题100】BFS/DFS 实战:岛屿数量 & 腐烂的橘子(力扣200 / 994 )(Go语言版)
本篇博客详细解析了三道经典的动态规划问题:198. 打家劫舍(线性状态转移)、279. 完全平方数与322. 零钱兑换(完全背包问题)。通过 Go 语言实现,帮助读者掌握动态规划的核心思想及其实战技巧。从状态定义到转移方程,逐步剖析每道题的解法,并总结其异同点,助力解决更复杂的 DP 问题。适合初学者深入理解动态规划的应用场景和优化方法。
36 0
|
3月前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
8月前
|
算法 索引
LeetCode(搜索插入位置)
如何使用二分查找算法来解决LeetCode上的“搜索插入位置”问题,确保时间复杂度为O(log n),并提供了详细的代码实现和分析。
54 2
|
8月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
69 0
Leetcode第三十三题(搜索旋转排序数组)
|
10月前
|
算法
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II
|
8月前
【LeetCode 39】700.二叉搜索树中的搜索
【LeetCode 39】700.二叉搜索树中的搜索
58 0
|
10月前
|
资源调度 JavaScript 定位技术
Vue2使用百度地图展示或搜索地点(vue-baidu-map)
本文介绍了如何在 Vue 项目中使用 `vue-baidu-map` 插件,包括安装、全局注册及具体应用。首先通过 `yarn add vue-baidu-map` 安装插件,并在 `main.js` 中全局注册。然后展示了如何在地图上显示特定位置的标记,以及如何搜索地点并获取其经纬度和详细地址信息。代码示例提供了详细的实现方法和样式调整。如需使用,请确保已获取百度地图 API 的密钥。
1753 1
|
10月前
|
算法
LeetCode第74题搜索二维矩阵
文章讲解了LeetCode第74题"搜索二维矩阵"的解决方案,利用二分搜索法将问题简化,并通过数学转换找到二维矩阵中的对应元素,展示了将二维问题转化为一维问题的解题技巧。
LeetCode第74题搜索二维矩阵

热门文章

最新文章