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) 排序中时间复杂度基本上都是nlog(n)或者n*n 最快的基数排序符合 但是 基数排序要知道数组中的数字有几位数组成的。题目中不具备这样的条件 我就思考了半天考虑 用图和hash表的方式直接实现查找连续字数组。数组中数据要想连续 你拿到一个数据必须具备以下两个条件 1.数组中存在比这个数据大一的数据,2.数组中存在比这个数据小一的数字 用hashSet将数组中的数字存起来 随机找到某个数据查找上面的两个条件 如果满足其中一个 就以获得的新数据继续找 反正最终就是按照某个数据向数据的相邻两边找。说的不清楚 直接看代码吧。。。。
public class Solution { //最终复杂度是2*n
public int longestConsecutive(int[] num) {
int key = 1;//总的计数器
if(num == null||num.length==0) return 0;
HashSet<Integer> set = new HashSet<Integer>();
for(int i = 0;i<num.length;i++) set.add(num[i]);
while(!set.isEmpty()){
int kk = 1;//某个数据的计数器 因为随机取一个数 之后就要马上在Set里面删掉所以计数器初始化为1
Iterator iter = set.iterator();
int m = (Integer)iter.next();
set.remove(m);
int k = m+1;//向右查找
while(set.contains(k)){
set.remove(k);
kk++;
k++;
}
k=m-1;//想左查找
while(set.contains(k)){
set.remove(k);
kk++;
k--;
}
if(kk>key) key=kk;
}
return key;
}
}
体会就是 做算法 要好好利用 某种语言本身的数据结构 多语言工具本身的数据结构进行编程。