给定无序数组,求最大的连续的数的长度

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.

class Solution {
public:
    int longestConsecutive(vector<int> &num) {
        map<int, bool> flagMap;
        int nMaxLen = 1;

        for (vector<int>::iterator itr=num.begin(); itr!=num.end();++itr)
            flagMap[*itr] = true;

        for (vector<int>::iterator itr=num.begin(); itr!=num.end();++itr)
        {
            int nCount = 1;
            if (flagMap[*itr])
            {
                flagMap[*itr] = false;      // mark false

                int nLeft = *itr-1;
                while (flagMap.find(nLeft)!=flagMap.end() && flagMap[nLeft]){
                    flagMap[nLeft] = false;
                    ++nCount;
                    nLeft -= 1;
                }

                int nRight = *itr + 1;
                while (flagMap.find(nRight)!=flagMap.end() && flagMap[nRight]){
                    flagMap[nRight] = false;
                    ++nCount;
                    nRight += 1;
                }
            }

            if (nCount > nMaxLen)
            nMaxLen = nCount;
        }

        return nMaxLen;
    }

};
时间: 2024-10-13 05:00:51

给定无序数组,求最大的连续的数的长度的相关文章

无序数组中第Kth大的数

题目:找出无序数组中第Kth大的数,如{63,45,33,21},第2大的数45. 输入: 第一行输入无序数组,第二行输入K值. 该是内推滴滴打车时(2017.8.26)的第二题,也是<剑指offer>上最小k个数的变形.当时一看到题,这个不是用快排吗?然后就写了,结果始终没有通过,遗憾的超时提交了.错误点主要在于,这里求的是第K大的数,而若是我们使用K去判断快排得到的下标,得到的是第K个数(等同于排序以后从左往右下标为K-1),而题中隐藏的意思等同于排序以后从 右往左数第K个数.所写在写代码

算法导论:快速找出无序数组中第k小的数

题目描述: 给定一个无序整数数组,返回这个数组中第k小的数. 解析: 最平常的思路是将数组排序,最快的排序是快排,然后返回已排序数组的第k个数,算法时间复杂度为O(nlogn),空间复杂度为O(1).使用快排的思想,但是每次只对patition之后的数组的一半递归,这样可以将时间复杂度将为O(n). 在<算法导论>有详细叙述 这里主要用C++实现,实现思路就是先选取当前数组的第一个数作为"主轴",将后面所有数字分成两部分,前面一部分小于"主轴",后面一部

128. Longest Consecutive Sequence *HARD* -- 寻找无序数组中最长连续序列的长度

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

无序数组求第K大/第K小的数

方法一:quicksort 根据快排思想,从后往前找比基准数小的,交换位置. 从前往后找比基准数大的,交换位置. 最后安放基准数. 保证 l到p 是大数,若 p-l+1==k 那么p就是第K大 若 p-l+1<k 那么从 p+1 到 r 中 找 k-(p-l+1)大的数 若 p-l+1>k 那么从 l 到 p-1中 找第k大的数. 1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #in

*HDU2852 树状数组(求第K小的数)

KiKi's K-Number Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3864    Accepted Submission(s): 1715 Problem Description For the k-th number, we all should be very familiar with it. Of course,to

查找无序数组中第K大的数

思路: 利用快速排序的划分思想 可以找出前k大数,然后不断划分 直到找到第K大元素 代码: #include <iostream> #include <algorithm> #include <cstdio>5 using namespace std; int findK(int left, int right, int arr[], int k) { if(left >= right) return arr[left]; int first = left, la

有序和无序数组的二分搜索算法

题目意思 1.给定有序数组A和关键字key,判断A中是否存在key,如果存在则返回下标值,不存在则返回-1. 2.给定无序数组A和关键字key,判断A中是否存在key,如果存在则返回1,不存在则返回0. 对于1.2问题,我们都可以简单的写出O(n)的从头到尾为的扫描算法,这里就不在累赘,这里我们讨论的是基于二分查找的算法,使其时间在渐进意义上达到O(logn). 对于有序的数组,很"容易"写出基于二分的函数. 那么问题2,对于无序数组,怎么查找呢?这里我们用到了快速排序的划分原则.算法

一道数组求连续子集最大值的题目。

昨天晚上花了几个小时,终于把这个题目给实现了.后面再优化.今天先贴出来晒晒. 据说是浙江大学计算机系一道考研题目(给定一个有符号整形数组,输出和胃最大并且连续的子数组).当初只会算最大值,不会返回一个数组作为结果.花了点时间,把程序改进了一下.有些不成熟.先放放.好歹是实现了. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SumMax { class

求一无序数组中第n大的数字 - 快速选择算法

逛别人博客的时候,偶然看到这一算法题,顺便用C++实现了一下. 最朴素的解法就是先对数组进行排序,返回第n个数即可.. 下面代码中用的是快速选择算法(不晓得这名字对不对) 1 #include <vector> 2 #include <iostream> 3 #include <stdexcept> 4 #include <cstdio> 5 6 const int QS_EERRMSG_LEN = 256; 7 8 9 /** 10 * 快速选择求无序数组