代码编织梦想

相似题:LeetCode 300. 最长上升子序列


本题链接:https://leetcode-cn.com/problems/longest-consecutive-sequence/


题描述:


解题思路(map + 遍历):

利用 map 表示当前元素是否存在数组中。

每次对当前元素进行向前和向后的遍历,统计该元素的连续序列的长度。


代码实现(map + 遍历):

/**
 * @param {number[]} nums
 * @return {number}
 */
var longestConsecutive = function(nums) {
    let map = new Map();
    let res = 0;
    for (let i = 0; i < nums.length; i++) {
        if (map.get(nums[i]) == undefined) {
            let num = 1;
            let index;
            index = nums[i] - 1;
            while(map.get(index) != undefined) {
                index--;
                num++;
            }
            index = nums[i] + 1;
            while(map.get(index) != undefined) {
                index++;
                num++;
            }
            map.set(nums[i], 1);
            res = res > num ? res : num;
        }
    }
    return res;
};

时间复杂度:O(n^2)

空间复杂度:O(n)


优化思路(set + 遍历):

在上面的代码中,我们对数组中的每个元素都进行了向上和向下的搜寻,实际上,我们只要对一段连续序列中最小的元素开始向上搜寻即可。

即如果该元素在数组中没有前驱(x 的前驱是 x - 1),便开始从该元素向上搜寻。

利用 set 表示一个元素是否存在该数组中。


优化代码实现(set + 遍历):

/**
 * @param {number[]} nums
 * @return {number}
 */
var longestConsecutive = function(nums) {
    let set = new Set(nums);
    let res = 0;
    for (let i = 0; i < nums.length; i++) {
        if (set.has(nums[i] - 1) == false) {
            let t = nums[i];
            let num = 0;
            while (set.has(t) == true) {
                t++;
                num++;
            }
            res = res > num ? res : num;
        }
    }
    return res;
};

时间复杂度:O(n)

空间复杂度:O(n)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/ySFRaabbcc/article/details/111097714

canvas - 炫彩小球-爱代码爱编程

<style> *{ margin: 0; padding: 0; } canvas { border: 1px solid #333; display: block; margin: 20px auto 0; } </styl

js-随机颜色-爱代码爱编程

function getRandomColor(){ var colorStr = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f"; var colorArr = colorStr.split(","); var color = "#";

前端跨域(跨域、CROS、JSONP)-爱代码爱编程

跨域 指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。例如:a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源。注意:跨域限制访问,其实是浏览器的限制。特别注意:不同源的页面之间

2020年下半年1+X Web前端开发(中级)实操考试模拟试题一(附答案)-爱代码爱编程

传送门教育部:职业教育将启动“1+X”证书制度改革职业教育改革1+X证书制度试点启动1+X成绩/证书查询入口 文章目录 试题一(每空 2 分,共 30 分)试题一答案试题二(30分)试题二答案试题三(每空 2 分,共 20 分)试题三答案试题四(每空 2 分,共 20 分)试题四答案 试题一(每空 2 分,共 30 分) 阅

JavaScript的ES6语法-爱代码爱编程

1. let声明变量 1)在js中,使用var声明的变量往往会越域,而使用let声明的变量,有严格的局部作用域。 2)var可以给一个变量声明多次,而let只能声明一次。 3)var 会变量提升,let 不存在变量提升 //var 声明的变量往往会越域 //let 声明的变量有严格局部作用域 { var a = 1; let b =

用 canvas.toDataURL() 将图片转为Base64编码时避免跨域报错的方法【避坑】-爱代码爱编程

用 canvas.toDataURL() 将图片转为Base64编码时避免跨域报错的方法【避坑】 梗概 本文主要介绍canvas.toDataURL()将图片转为Base64编码时避免跨域的两种方法: 1、搭建服务器,将HTML文件和图片挂在服务器上使两者位于同一域下(较麻烦); 2、用 URL.createObjectURL() 方法创建一个指向

leetcode 滑动窗口小结 (一)-爱代码爱编程

目录 小结以及代码框架76. 最小覆盖子串滑动窗口代码以及注释567. 字符串的排列滑动窗口438. 找到字符串中所有字母异位词3. 无重复字符的最长子串化简框架reference 小结以及代码框架 滑动窗口技巧属于双指针技巧。 该算法的思路为维护一个窗口,不断滑动,然后更新答案。 大致框架如下:[参考labuladong的

原地堆排序(不占用额外空间)(C++实现)-爱代码爱编程

原地堆排序,不占用额外空间 // 原地堆排序,不占用额外空间 template<typename T> void shiftDown(T data[], int n, int i) { using uint = unsigned int; uint k = i; whil

LeetCode 100. 相同的树 做题小结-爱代码爱编程

题目: 给定两个二叉树,编写一个函数来检验它们是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例 1: 输入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1,2,3] 输出: tr

k图着色 遗传算法的简单python伪代码-爱代码爱编程

文章目录 概述python伪代码 概述 该问题中所使用到的部分函数与知识与局部搜索、模拟退火中的相同,参照k图着色 局部搜索算法与模拟退火算法的python实现 遗传算法的整体思路比较简单,在解决图着色问题时这里解的编码形式就是所有节点的颜色序列,这时候依旧可以使用之前在局部搜索和模拟退火算法中所用的冲突计算函数get_conflict_c

贪心算法-爱代码爱编程

贪心算法的核心思想就是在解答问题时,每次操作保证达到局部最优,那最后的结果一定会达到全局最优。下面是自己在leetcode刷的几道题以及用贪心的解题思路和实现代码(C++)。 122. Best Time to Buy and Sell Stock II 题目描述: Say you have an array prices for which the

leetcode 376. 摆动序列(dp)-爱代码爱编程

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。 例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个