[路飞]_leetcode-128-最长连续序列

简介: leetcode-128-最长连续序列

网络异常,图片无法展示
|


[题目地址][B站地址]


给定一个未排序的整数数组 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
复制代码


提示:


  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109


sort


解题思路


本题输入的是一个未排序的数组,但是要找的是数字连续的子序列,所以最直接想到的方式就是进行升序排序,然后根据数字连续的性质获取子序列的长度,最后所有子序列长度的最大值就是要求的结果值。


代码实现


var longestConsecutive = function(nums) {
  // 对输入数组升序排序
  nums.sort((a,b) => a-b)
  // 初始化最大值为0,当前子序列长度为0,前一个元素值为正无穷
  let max = 0,len = 0,pre = Infinity;
  // 遍历排序后的输入数组
  for(let i = 0;i<nums.length;i++){
    // 如果当前值 = pre,说明是重复值,跳过循环
    if(pre === nums[i]) continue;
    // 如果当前符合数字连续性质,子序列长度+1
    if(pre === nums[i]-1) len++
    // 否则,说明前一个子序列结束,尝试更新max,并重置 len = 1
    else max = Math.max(max,len),len = 1
    // 更新 pre 为当前元素值
    pre = nums[i]
  }
  // 返回 max 和最后一个子序列长度的最大值
  return Math.max(max,len)
};
复制代码


这样的解题思路虽然可以解决问题,但是因为先进行了一次排序,所以并没有达到本题对于时间复杂度 O(n) 的要求。


Set


解题思路


将输入数组转为 Set,遍历 Set,如果在集合中找不到当前元素值-1的元素,则说明当前元素是其所在子序列的第一个元素。


初始化当前子序列长度为1,然后查找是否有值为当前元素值+1的元素,如果可以找到,则长度+1,并继续查找。


当无法找到符合要求的元素,则说明当前子序列结束,尝试用当前子序列长度更新结果值。


当遍历完整个集合,就获取到了最长子序列的长度。


代码实现:


var longestConsecutive = function(nums) {
  // 根据输入数组创建set
  const set = new Set(nums);
  // 初始化结果值为 0
  let res = 0;
  // 遍历 set
  set.forEach(item => {
    // 如果 set 没有当前值-1的值,说明当前值是其所在子序列的起始值
    if(!set.has(item-1)){
      // 初始化 len = 1
      let len = 1;
      // 当可以找到当前值 +1 的值时,子序列长度+1,并更新当前值
      while(set.has(item+1)){
        len++,item++
      }
      // 尝试用子序列长度更新结果值
      res = Math.max(res,len)
    }
  })
  // 返回结果值
  return res;
};
复制代码


至此我们就完成了 leetcode-128-最长连续序列


如有任何问题或建议,欢迎留言讨论!

相关文章
|
4月前
|
Python
【Leetcode刷题Python】376. 摆动序列
文章提供了解决LeetCode "摆动序列" 问题的Python实现代码,通过遍历整数数组并使用两个变量 down 和 up 来记录正差和负差摆动序列的长度,最终返回最长摆动子序列的长度。
43 0
|
7月前
|
存储 算法
《LeetCode》—— 摆动序列
《LeetCode》—— 摆动序列
|
7月前
|
算法 安全 测试技术
[组合数学]LeetCode:2954:统计感冒序列的数目
[组合数学]LeetCode:2954:统计感冒序列的数目
|
7月前
|
算法 测试技术 C#
【单调栈】LeetCode2030:含特定字母的最小子序列
【单调栈】LeetCode2030:含特定字母的最小子序列
|
4月前
|
Python
【Leetcode刷题Python】946. 验证栈序列
LeetCode题目“946. 验证栈序列”的Python解决方案,通过模拟栈的压入和弹出操作来验证给定的两个序列是否能通过合法的栈操作得到。
34 6
|
4月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
27 3
|
4月前
|
Python
【Leetcode刷题Python】105. 从前序与中序遍历序列构造二叉树
LeetCode上105号问题"从前序与中序遍历序列构造二叉树"的Python实现,通过递归方法根据前序和中序遍历序列重建二叉树。
32 3
|
4月前
|
算法 Python
【Leetcode刷题Python】300. 最长递增子序列
LeetCode 300题 "最长递增子序列" 的两种Python解决方案:一种使用动态规划,另一种使用贪心算法结合二分查找。
42 1
|
4月前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
44 0
|
4月前
|
Python
【Leetcode刷题Python】674. 最长连续递增序列
LeetCode 674题 "最长连续递增序列" 的Python解决方案,使用动态规划算法找出给定整数数组中最长连续递增子序列的长度。
106 0