哈希--128. 最长连续序列/medium 理解度B

1、题目

给定一个未排序的整数数组 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
Related Topics
  • 并查集
  • 数组
  • 哈希表

2、题目分析

一批数据按连续性分成了多段,查找最长分段的长度。
(使用分段处理的思路,遇到段头再开始处理,其他元素直接返回。这里的关键是:判断某元素是否为所在段的段头)

注:如何判断某元素是否为所在分段开头位置:判断该元素-1的数是否存在于哈希表,若不存在,则该元素是所在分段开头位置

将数据都存在哈希表中,
遍历数组,只要遇到该元素是所在分段的开头位置,则遍历该段的长度。
若该元素不是所在分段的开头位置,则忽略。

3、复杂度最优解代码示例

    public int longestConsecutive(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for (int num : nums) {
            // 标记元素是否存在
            set.add(num);
        }

        int maxLength = 0;

        for (int num : set) {
            if (set.contains(num - 1)) {
                // 当前元素非段头元素,不处理
                continue;
            }

            // 遇到段头元素,开始遍历所在段,并记录段长
            int length = 1;
            while (set.contains(num + length)) {
                length++;
            }
            maxLength = Math.max(maxLength, length);
        }

        return maxLength;
    }

4、适用场景

最长连续序列(Longest Consecutive Sequence)是一种常见的算法问题,主要用于解决一些与数字序列相关的问题。以下是一些适用场景:

  1. 面试题和编程挑战:在许多技术面试中,最长连续序列问题常常被用作考察应聘者编程能力和解决问题思路的题目。

  2. 内存管理:在某些操作系统或数据库管理系统中,可能需要找到一组连续的空闲内存块来满足特定的需求。

  3. 调度算法:在生产调度、任务分配等场景中,可能需要找到一组连续的任务或资源以满足某些约束条件。

  4. 数据压缩:在无损压缩算法中,通过寻找重复出现的模式并记录其位置,可以有效地压缩数据。

  5. 股票交易策略:在股票市场分析中,可能会用到最长连续上涨或下跌的股票序列作为交易信号。

  6. 网络安全:在入侵检测系统中,可以通过分析网络流量中的连续事件来识别异常行为。

  7. 时间线分析:在历史数据分析或项目管理中,可能需要找到一系列连续的时间点或事件。

  8. 物流和供应链管理:在货物追踪、库存管理等方面,可能需要找到一系列连续的物品或订单。

  9. 生物信息学:在基因测序或蛋白质结构分析中,可能会用到最长连续的DNA序列或氨基酸序列。

  10. 游戏开发:在某些类型的游戏中,可能需要生成或分析一系列的连续事件或状态。

### 哈希数据结构例题与练习题 以下是关于哈希表的经典例题及其解析: #### 1. 最长回文串 (Easy) 给定一个字符串 `s`,找出其中最长的回文子序列。可以通过统计每种字符的数量并利用贪心策略解决此问题[^1]。 ```python from collections import Counter def longest_palindrome(s: str) -> int: count = Counter(s) length = 0 odd_found = False for char_count in count.values(): if char_count % 2 == 0: length += char_count else: length += char_count - 1 odd_found = True return length + 1 if odd_found else length ``` --- #### 2. 字母异位词分组 (Medium) 给定一组字符串,将所有的字母异位词分类成不同的组。可以使用哈希表记录每个排序后的字符串作为键,原始字符串列表作为值[^3]。 ```python from collections import defaultdict def group_anagrams(strs: list[str]) -> list[list[str]]: anagram_map = defaultdict(list) for s in strs: key = ''.join(sorted(s)) anagram_map[key].append(s) return list(anagram_map.values()) ``` --- #### 3. 无重复字符的最长子串 (Medium) 在一个字符串中找到不含任何重复字符的最长连续子串。滑动窗口配合哈希集合能够高效解决问题[^4]。 ```python def length_of_longest_substring(s: str) -> int: char_set = set() max_len = start = 0 for end, c in enumerate(s): while c in char_set: char_set.remove(s[start]) start += 1 char_set.add(c) max_len = max(max_len, end - start + 1) return max_len ``` --- #### 4. 最小窗口子串 (Hard) 在字符串 S 中找到包含 T 的所有字符的最小子串。双指针加哈希表可有效完成任务[^1]。 ```python from collections import Counter def min_window(s: str, t: str) -> str: need = Counter(t) window_counts = {} have, required = 0, len(need) l, r = 0, 0 min_len = float('inf') res = "" while r < len(s): c = s[r] window_counts[c] = window_counts.get(c, 0) + 1 if c in need and window_counts[c] == need[c]: have += 1 while have == required: if r - l + 1 < min_len: min_len = r - l + 1 res = s[l:r+1] d = s[l] window_counts[d] -= 1 if d in need and window_counts[d] < need[d]: have -= 1 l += 1 r += 1 return res ``` --- #### 5. C++ 实现:两数之和 (Easy) 给定整数数组 nums 和目标值 target,返回使它们相加为目标值的两个索引。C++ 可以借助 unordered_map 来快速定位所需元素的位置[^2]。 ```cpp #include <unordered_map> #include <vector> std::vector<int> twoSum(std::vector<int>& nums, int target) { std::unordered_map<int, int> map; for(int i = 0; i < nums.size(); ++i){ int complement = target - nums[i]; if(map.find(complement) != map.end()){ return {map[complement], i}; } map[nums[i]] = i; } return {}; } ``` --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值