又是一道Hashtable或者HashSet的空间换时间的题!
取出HashSet中的某一元素x,找x-1,x-2....x+1,x+2...是否也在set里
package Level3; import java.util.HashSet; import java.util.Set; /** * 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 in O(n) complexity. * */ public class S132 { public static void main(String[] args) { int[] num = {0,0}; System.out.println(longestConsecutive(num)); } // 遇到不能排序又要复杂度O(n)有序的问题,只能增加空间复杂度,用hashset或者hashtable public static int longestConsecutive(int[] num) { Set<Integer> set = new HashSet<Integer>(); for (int i : num) { set.add(i); } int max = 0; for(int i=0; i<num.length; i++){ if(set.contains(num[i])){ int next = num[i] - 1; // 找比num[i]小一个的值 int count = 1; set.remove(num[i]); // 及时的移除,减少之后的查找时间 while(set.contains(next)){ set.remove(next); next--; count++; } next = num[i] + 1; // 找比num[i]大一个的值 while(set.contains(next)){ set.remove(next); next++; count++; } max = Math.max(max, count); } } return max; } }
之前这样写,但发现最差复杂度并不是O(n),因此会超时
public class Solution { public int longestConsecutive(int[] num) { HashSet hs = new HashSet(); int max = 0; for(int i : num) { hs.add(i); int cnt = 0; int tmp = i; while(hs.contains(tmp-1)) { tmp--; cnt++; } while(hs.contains(tmp+1)) { tmp++; cnt++; } max = Math.max(max, cnt); } return max; } }
重写:
public class Solution { public int longestConsecutive(int[] num) { HashSet hs = new HashSet(); for(int i : num) { hs.add(i); } int max = 0; for(int i : num) { int cnt = 1; hs.remove(i); int tmp = i; while(hs.contains(tmp-1)) { hs.remove(tmp-1); tmp--; cnt++; } tmp = i; while(hs.contains(tmp+1)) { hs.remove(tmp+1); tmp++; cnt++; } max = Math.max(max, cnt); } return max; } }