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.
Solution:
We use a bimap to keep the intervals, implemented with two hashmaps one that starts are mapped to ends and the other one viceversa.public class Solution { public int longestConsecutive(int[] num) { int longest=0; HashMap<Integer, Integer> startToEnd = new HashMap<Integer, Integer>(); HashMap<Integer, Integer> endToStart = new HashMap<Integer, Integer>(); for(int i =0; i<num.length; i++) { int start = num[i]; int end = num[i]; if(endToStart.containsKey(num[i])) { start = endToStart.get(num[i]); startToEnd.remove(start); endToStart.remove(num[i]); } if(startToEnd.containsKey(num[i])) { end = startToEnd.get(num[i]); startToEnd.remove(num[i]); endToStart.remove(end); } if(endToStart.containsKey(num[i]-1)) { start = Math.min(start, endToStart.get(num[i]-1)); startToEnd.remove(start); endToStart.remove(num[i]-1); } if(startToEnd.containsKey(num[i]+1)) { end = Math.max(end, startToEnd.get(num[i]+1)); startToEnd.remove(num[i]+1); endToStart.remove(end); } startToEnd.put(start,end); endToStart.put(end,start); longest = longest < end- start + 1 ? end- start + 1 : longest; } return longest; } }
No comments :
Post a Comment