时间复杂度为o(n)的解法

最长的可整合子数组的长度

http://www.nowcoder.com/questionTerminal/677a21987e5d46f1a62cded9509a94f2

#include<iostream>
#include<vector>
#include<algorithm>
#include<unordered_set>
using namespace std;

//1,将数组用哈希表存储起来这样可以实现快速查询
//2,从数组的第一个元素开始,如果当前元素为x,那么如果在哈希表中存在x-1时直接跳过此元素
//因为当我们在遍历到x-1时肯定可以采用循环的方式来找到x
//3,如果不存在x-1但是存在x+1我们采用循环的方式来找到所有的连续序列
//4,虽然for循环中嵌套了while循环,但是while循环在整个的遍历中最多遍历n次,所以总体的时间
//复杂度为o(n + n) = o(n);
//5,这个过程大家模拟一下就能理解
int longestConsecutive(vector<int>& nums) {

    if (nums.size() == 0) return 0;
    unordered_set<int> m(nums.begin(), nums.end());

    int maxlen = 1;
    int tmp;
    for (auto& e : nums) {
        tmp = e;
        if (m.count(e - 1) == 0) {
            tmp = e + 1;
            while (m.count(tmp)) {
                tmp++;
            }
        }
        maxlen = max(maxlen, tmp - e);
    }

    return maxlen;
}
int main() {

    int N;
    while(cin >> N){
    vector<int> v(N);
    for (int i = 0; i < N; ++i) {
        cin >> v[i];
    }
    cout << longestConsecutive(v)<<endl;;
    }
    return 0;
}
全部评论
你这个是错的
点赞
送花
回复
分享
发布于 2020-08-25 15:51

相关推荐

移动云能力 苏小妍 总包多3w左右
点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务