1957

无聊蛋疼的1957写的低端博客
随笔 - 214, 文章 - 1, 评论 - 38, 阅读 - 21万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

[leetcode]Longest Consecutive Sequence

Posted on   1957  阅读(4102)  评论(2编辑  收藏  举报

最近经常闲的无聊,于是就做做leetcode的题了,目测好像都不是很难.

不过呢,闲的无聊还是记录下某些做了的题.

 

Given an unsorted array of integers, find the length of the longest consecutive elements sequence.

For example,
Given [100, 4, 200, 1, 3, 2],
The longest consecutive elements sequence is [1, 2, 3, 4]. Return its length: 4.

Your algorithm should run in O(n) complexity.

 

一看呢,就是排序,然后找就好了,但是要求是O(n),排序明显是个O(n*logn)的算法.

只是找连续的嘛,我们可以把所有的数字都存入hash表,然后随意从某个数字开始找他的前面和后面那个是否存在.

然后得到一个最大的长度.当然找过的就可以删掉了...你想,一个连续的序列,你从中间任意位置开始往两边找不都一样么.

所以只要找过就可以删掉了.

 

class Solution {
public:
    set<int> flag;
    int findBound(int n , bool asc){
        int ans = 0;
        set<int>::iterator iter;
        while((iter = flag.find(n)) != flag.end()){
            flag.erase(iter);
            ans ++;
            if(asc) n-- ; else n++;
        }
        return ans;
    }
    int longestConsecutive(vector<int> &num) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
             
        int ans = 0;
        flag.clear();
        for(int i = 0 ; i < num.size() ; i++)
           flag.insert(num[i]);
        for(int i = 0 ; i < num.size(); i++){
            ans = max(findBound(num[i],true) + findBound(num[i]+1,false) , ans);
        }
        return ans;
    }
};

  ----update----

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
    int longestConsecutive(vector<int> &num) {
        s.clear();
        for (int i = 0; i < num.size(); i++) {
            s.insert(num[i]);
        }
        int ans = 0;
        for (int i = 0; i < num.size(); i++) {
            ans = max(ans, bound(num[i], true) + bound(num[i] + 1, false));
        }
        return ans;
    }
private:
    unordered_set<int> s;
    int bound(int num, bool asc) {
        int cnt = 0;
        for (auto iter = s.find(num); iter != s.end(); iter = s.find(num)) {
            s.erase(iter);
            if (asc) num--; else num++;
            cnt++;
        }
        return cnt;
    }
};

  

编辑推荐:
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· SQL Server统计信息更新会被阻塞或引起会话阻塞吗?
阅读排行:
· 本地部署 DeepSeek:小白也能轻松搞定!
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 如何基于DeepSeek开展AI项目
点击右上角即可分享
微信分享提示