数组中最长连续序列
来源:互联网 发布:澳大利亚mac口红便宜么 编辑:程序博客网 时间:2024/05/17 06:44
给定无序数组arr, 返回其中最长的连续序列的长度
举例
a[7] = {2,3,4,1,5,7,100},最长的连续序列为[1,2,3,4,5],所以返回5.
本文先假设此数组是有序的,其基本思路如下:
简单来说,排序后我们只要遍历数组,检查当前值减1是否等于上一个值,如果等,增加当前连续序列的计数;如果不等,将当前计数与当前最大值比较,如果更优替换最大值, 并重置计数为1。具体到细节上,我们还要考虑几个问题:
- 第一个数
处理第一个数时是没有上一个值的。有人可能觉得可以给存储上一个值的变量赋一个特别的初始值来表示处理的是第一个数。但是由于数组内元素的取值范围是所有的整数,不可能找出一个特别的值。所以代码中需要对第一个数做特殊的判断
- 重复的数
数组中可能会有重复的数,所以我们不能光判断当前值减1等于或不等于上一个值。还需要加上一个等不等与上一个值的判断,如果等,说明是一个重复的数字,直接不做任何处理跳到数组中的下一个数。
- 最后一组连续序列
由于我们只在遍历中发现当前值减1不等于上一个值时才尝试更新序列长度最大值。如果有一个连续序列一直持续到数组中的最后一个元素,这个序列的长度是没有得到处理的。因此我们需要在遍历完数组后再尝试更新依稀最大值。
C++代码如下:
#include <stdio.h>#include <iostream>#include <vector>#include <unordered_map>#include <algorithm>using namespace std;int sortLongestConsecuive(vector<int> arr){ sort(arr.begin(), arr.end()); int cur = 0; int max = 0; int tmp;for (int i = 0; i < arr.size(); i++){ if (i == 0) cur++; else { if (arr[i] == tmp) continue; else if(arr[i] == tmp + 1) cur++; else { if(cur > max) max = cur; cur = 1; } } tmp = arr[i];}if(max < cur) max = cur;return max;}int main(){ int a[7] = {2,3,4,1,5,7,100}; vector<int> arr(7) ; for(int i = 0; i < 7; i++) arr[i] = a[i]; int num; //num = longestConsecuive(arr); num = sortLongestConsecuive(arr); cout<<num<<endl;return 0;}
本题目利用哈希表可以实现时间复杂度为O(N)、额度空间为O(N)的方法,程序中的具体步骤如下:
求解函数(数组)
遍历数组生成哈希表
遍历数组
序列长度1 = 找连续序列函数(当前值,增加方向)序列长度2 = 找连续序列函数(当前值 - 1,减少方向)如果序列长度1 + 序列长度2 > 当前最长序列,更新最长序列
遍历结束
求解函数结束
int longestConsecuive(vector<int> arr){ int maxnum = 0; unordered_map<int, int> mp; if(arr.size() == 1) return 1; for (int i = 0;i < arr.size(); i++) mp[arr[i]] = 1; for(int i = 0; i<mp.size(); i++) { int num = 1; if(mp.count(arr[i])) { int left = arr[i] - 1; while (mp.count(left) && mp[left] != 0) { num++; mp[left--] = 0; } int right = arr[i] + 1; while(mp.count(right) && mp[right] != 0) { num++; mp[right++] = 0; } } if(num > maxnum) maxnum = num; }return maxnum;}
部分参考:http://www.tuicool.com/articles/B7FBb2
0 0
- 数组中最长连续序列
- 无序数组中最长连续序列
- 数组——数组中最长连续序列
- 数组中的最长连续序列
- 求数组中最长的连续子序列
- 获取一个数组中最长的连续的元素序列
- 无序数组中找到最长连续子序列
- longest-consecutive-sequence,数组中最长的连续序列
- 数组中最长的连续序列(longest consecutive sequence)
- 求数组中最长连续递增子序列
- 数组的最长连续的序列
- 数组中的最长连续序列---dp实现
- 矩阵中最长连续递增子序列
- O(n)时间找出无序数组中最长的连续递增序列
- 求数组中最长的连续序列(Longest Consecutive Sequence )
- [笔试题]找数组中最长和为0连续子序列
- Rust : 求出一个字符串数组中最长的公共连续子序列
- 【最长连续序列问题】
- 中点分割法 线段与矩形关系的判断 向量
- MySQL内核深度优化
- 自动引用计数
- c#在指定内容中通过正则查找字符
- 树莓派3wiringPi安装以及串口相关调试和配置
- 数组中最长连续序列
- 很久没写文章了。。。
- sprintf的使用
- 王朝 第十一周
- Caffe、TensorFlow、MXnet三个开源库对比
- HTML标签(一)
- 对某一程序取消用户账户控制
- 免费的大数据平台CDH和HDP都是啥?
- 学习笔记之shell的文本处理工具