LeetCode热题100#7 128.最长连续序列(java)

ps:本文章仅用来记录日常学习的所思所想,各位看到可取之处也可纳为己用,说的不对的地方还请多多指教。


1.题目描述

128.最长连续序列(中等)

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

2.题目分析 

        题目很好理解,也就是算出最长连续元素的个数,但有个关键是,观察序列我们可知这连续序列是不能重复的。去重我们一般就要想到HashSet,这家伙的不允许重复特性让我们去重变得简单许多。

class Solution {
    public int longestConsecutive(int[] nums) {
        Set<Integer> nums_set = new HashSet<Integer>();
        for (int num : nums){
            nums_set.add(num);
        } 

        int longestStreak = 0;
        for(int num : nums_set){
            if(!nums_set.contains(num - 1)){
                int currentNum = num;
                int currentStreak = 1;

                while(nums_set.contains(currentNum+1)){
                    currentNum +=1;
                    currentStreak +=1;
                }
                longestStreak = Math.max(longestStreak,currentStreak);
        
            }
        }
        return longestStreak;
    }
}

        首先我们创建一个HashSet,这没什么好说的,值得一说的是后面HashSet<Integer>里面的Integer是可以省略的 

Set<Integer> nums_set = new HashSet<Integer>();

         然后我们用增强型for循环来添加元素到HasSet中去重;

for (int num : nums){
            nums_set.add(num);
        } 

        再然后我们声明一个变量longestStreak来最后输出最大连续序列数, 遍历HashSet里的元素,当遍历到的num没有前驱的时候,它就是我们要找的连续序列的开端,我们将其赋值给记录变量currentNum,为了增加可读性,我们还可以增加一个记录当前最大连续数的变量currentStreak。

int longestStreak = 0;
        for(int num : nums_set){
            if(!nums_set.contains(num - 1)){
                int currentNum = num;
                int currentStreak = 1;

                while(nums_set.contains(currentNum+1)){
                    currentNum +=1;
                    currentStreak +=1;
                }
                longestStreak = Math.max(longestStreak,currentStreak);
        
            }
        }

        每当HashSet里有currentNum的后继 ,currentNum加一,currentstreak加一。当HashSet中没有后继的时候,就会跳出循环,然后我们将其赋值给longestStreak,然后return就完事了。至于为什么循环里不直接加longestStreak,我只能说我这样子写更加好读,不过那样也是可行的。


3.总结

HashSet和HashMap都是Java中的集合类,它们之间有几个关键的区别:

  1. 数据结构

    • HashSet是基于哈希表实现的集合,它使用哈希函数来存储元素,不允许有重复的元素。
    • HashMap也是基于哈希表实现的键值对映射,它使用键值对来存储数据,其中键是唯一的,值可以重复。
  2. 存储内容

    • HashSet存储的是单个对象的集合,不需要键值对。
    • HashMap存储的是键值对的映射关系,每个键值对都包含一个键和一个值。
  3. 用途

    • HashSet通常用于存储和检索集合中是否存在某个对象,它提供了高效的查找操作。
    • HashMap用于存储键值对的映射关系,可以根据键来获取对应的值,是键值对的快速查找容器。
  4. 迭代顺序

    • HashSet中元素的迭代顺序并不是特定的,通常是无序的。
    • HashMap中键值对的迭代顺序也不是特定的,通常也是无序的。如果需要有序的遍历,可以使用LinkedHashMap。
  5. 容错性

    • HashSet在存储元素时,会检查元素的hashCode值以及equals方法来避免存储重复元素。
    • HashMap在存储键值对时,会根据键的hashCode值来确定存储位置,同时会处理哈希冲突,确保键的唯一性。

总的来说,HashSet用于存储独立的对象集合,而HashMap用于存储键值对的映射关系。它们分别适用于不同的场景和需求。

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值