最长连续数

最长连续数

题目

https://leetcode.cn/problems/longest-consecutive-sequence/

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

代码
class Solution {
    public int longestConsecutive(int[] nums) {
        // 去除重复元素并计算长度
        Set<Integer> uniqueNums = new HashSet<>(Arrays.stream(nums).boxed().collect(Collectors.toList()));

        // 初始化哈希表,存储数字及其位置
        Map<Integer, Integer> numMap = new HashMap<>();
        for (int num : uniqueNums) {
            numMap.put(num, -1);
        }

        // 初始化最长连续序列长度
        int maxLength = 0;

        // 遍历所有数字,处理连续序列
        for (int num : uniqueNums) {
            if (numMap.get(num) != -1) { // 跳过已处理过的数字
                continue;
            }

            // 初始化当前序列长度
            int count = 1;
            numMap.put(num, count);

            // 向两边扩展
            int prev = num - 1;
            int next = num + 1;
            while (numMap.containsKey(prev)) {
                count++;
                numMap.put(prev, count);
                prev--;
            }
            while (numMap.containsKey(next)) {
                count++;
                numMap.put(next, count);
                next++;
            }

            // 更新最长序列长度
            maxLength = Math.max(maxLength, count);
        }

        return maxLength;
    }
}
思路

最长连续数-思路

  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是用 C++ 实现输入一个字符串,求该字符串中最长连续字序列出现的起始位置及其长度的代码: ```cpp #include <iostream> #include <string> using namespace std; int main() { string s; getline(cin, s); // 输入字符串 int start = -1; // 最长连续字序列的起始位置 int len = 0; // 最长连续字序列的长度 int curStart = -1; // 当前连续字序列的起始位置 int curLen = 0; // 当前连续字序列的长度 for (int i = 0; i < s.length(); i++) { if (isdigit(s[i])) { // 如果当前字符是字 if (curStart == -1) { // 如果当前没有连续字序列 curStart = i; // 更新当前连续字序列的起始位置 } curLen++; // 更新当前连续字序列的长度 } else { // 如果当前字符不是字 if (curLen > len) { // 如果当前连续字序列比最长连续字序列更长 start = curStart; // 更新最长连续字序列的起始位置 len = curLen; // 更新最长连续字序列的长度 } curStart = -1; // 重置当前连续字序列的起始位置 curLen = 0; // 重置当前连续字序列的长度 } } if (curLen > len) { // 如果最后一个连续字序列比最长连续字序列更长 start = curStart; // 更新最长连续字序列的起始位置 len = curLen; // 更新最长连续字序列的长度 } if (start == -1) { // 如果没有连续字序列 cout << "No consecutive digit sequence found." << endl; } else { // 如果有连续字序列 cout << "The longest consecutive digit sequence starts at position " << start << " and has length " << len << "." << endl; } return 0; } ``` 输入一个字符串后,程序会输出形如 "The longest consecutive digit sequence starts at position x and has length y." 或者 "No consecutive digit sequence found." 的信息,其中 x 和 y 分别为最长连续字序列的起始位置和长度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值