[小米OJ] 4. 最长连续数列

思路:

时间限制为O(n),即不能使用先排序后寻找的方法。

这里利用哈希表查询插入复杂度都为O(1)的特性来解,利用一个哈希表来保存每一个数字以及其所在数列的长度

遍历每一个数字n:查询表中是否存在n-1和n+1,若存在,则hash[n]的值为1 + hash[n-1] + hash[n+1],若不存在即是 1.

同时,为了预防相同数字多次判断,每一次遍历时判断该数字在表中的value是否为0,若不为0说明已经判断过了,跳过即可。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string input;
    while (cin >> input)
    {
        istringstream iss(input);
        string temp;
        vector<int> vec;
        map<int, int> mapping;
        int maxNum = -1;
        while (getline(iss, temp, ‘,‘))
        {
            vec.push_back(atoi(temp.c_str()));
            mapping[atoi(temp.c_str())] = 0;
        }
        for (auto c : vec)
        {
            if (mapping[c] == 0)
            {
                mapping[c] = 1;
                if (mapping.count(c - 1))
                {
                    mapping[c] += mapping[c - 1];
                }
                if (mapping.count(c + 1))
                {
                    mapping[c] += mapping[c + 1];
                }
                maxNum = maxNum > mapping[c] ? maxNum : mapping[c];
            }
        }
        cout << maxNum << endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/ruoh3kou/p/10289642.html

时间: 2024-12-11 17:17:34

[小米OJ] 4. 最长连续数列的相关文章

nyist oj 36 最长公共子序列 (动态规划基础题)

最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列. tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列. 输入 第一行给出一个整数N(0<N<100)表示待测数据组数 接

最大连续数列和

题目描述 对于一个有正有负的整数数组,请找出总和最大的连续数列. 给定一个int数组A和数组大小n,请返回最大的连续数列的和.保证n的大小小于等于3000. 测试样例: [1,2,3,-6,1] 返回:6 class MaxSum { public: int getMaxSum(vector<int> A, int n) { // write code here if(A.size() == 0) return 0; int max = INT_MIN; int sum = 0; for(si

uva507 - Jill Rides Again(最长连续和)

题目:uva507 - Jill Rides Again(最长连续和) 题目大意:给每两个站之间的满意度,满意的路线必须加起来的和不小于0.帮Jill找出她满意的路线,要求是最长的,并且一样长的话取站相对靠前的. 代码: #include <stdio.h> #include <string.h> const int N = 20005; int s, b, e; int stop[N]; int solve () { int mm = stop[1]; int sum = sto

ACdream ????计算最长连续相同字符的个数

计算最长连续相同字符的个数 测试数据 输入: aaaassdfg adasafag ssddffffgt 输出: 4 1 4 <span style="font-size:18px;">#include<stdio.h> #include<string.h> int main() { int i,n,t; int b[105]; char a[105]; scanf("%d",&t); while(t--) { n=0;

HDU1069(最长单调递减数列)

告诉你n种规模的长方体的长,宽,高,每种规模的长方体个数不限,问你最多能搭多高的塔,塔是由这些长方体搭的,自上而下,每一块长方体都要比在它下面的长方体的规模小,即长和宽都比下面的长方体要小.注意长方体是可以调整的. 就是按照长和宽来排序,找最长的单调递减的数列.我们用dp[i]来表示搭建到第i块长方体的时候塔的最高高度,那么状态转移方程就是dp[i]=max(dp[i],dp[j]+s[i].h): #include <stdio.h> #include <string.h> #i

Refactoring之——代码的坏味道(四)过长参数列

1.1.4 Long Parameter List(过长参数列) 特征:一个方法有超过三四个的参数. 问题原因: 过长参数列可能是将多个算法并到一个函数中时发生的.函数中的入参可以用来控制最终选用哪个算法去执行. 过长参数列也可能是解耦类之间依赖关系时的副产品.例如,用于创建函数中所需的特定对象的代码已从函数移动到调用函数的代码处,但创建的对象是作为参数传递到函数中.因此,原始类不再知道对象之间的关系,并且依赖性也已经减少.但是如果创建的这些对象,每一个都将需要它自己的参数,这意味着过长参数列.

任意区间的最长连续递增子序列,最大连续子序列和

hdu3308 给n个数,有m个操作 U a b 表示将第a个数改成b Q a b 表示询问区间[a,b]的最长连续递增子序列. 区间询问问题且带修改,一般是用线段树来解决 那么要维护 Llen[rt], Lval[rt][2] 表示rt所对应的区间[l,r] 以l开头的最长连续递增子序列的长度, Lval[rt][0]表示子序列的最左边的值,Lval[rt][1]表示子序列最右边的值 Rlen[rt],Rval[rt][2]  表示rt所对应的区间[l,r]以r结尾的最长连续递增子序列的长度,

HDU 3308 LCIS(最长连续上升子序列)(线段树区间合并)

题意:给你n个整数,有两种操作,U A B把第A个数变成B,Q A B查询区间[A,B]的最长连续上升序列. 思路:还是查询和更新操作,而且也是询问区间中满足条件的连续最长区间 ,所以是线段树区间合并类型的题,通法是开三棵线段树,一个记录此区间内的LCIS的最长长度,一个记录从左边第一个数开始的LCIS长度,另一个记录从右边最后一个数结尾的LCIS长度.然后试图找到父亲与儿子关系维护的递推关系式就好 本题中的递推关系是: 1. 左儿子最右边的值 < 右儿子最左边的值 lmx = (左儿子的lmx

[LeetCode] Longest Consecutive Sequence 求最长连续序列

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 i