|
2 | 2 | // T: O(n) |
3 | 3 | // S: O(n) |
4 | 4 |
|
5 | | -import java.util.HashMap; |
6 | 5 | import java.util.HashSet; |
7 | | -import java.util.Map; |
8 | 6 | import java.util.Set; |
9 | 7 |
|
10 | 8 | public class LongestConsecutiveSequence { |
11 | | - private static class Node { |
12 | | - Node next; |
13 | | - Node previous; |
14 | | - } |
15 | | - |
16 | 9 | public int longestConsecutive(int[] nums) { |
17 | | - final Map<Integer, Node> nodes = createDisjointSets(nums); |
18 | | - return longestConsecutiveSequenceLength(nodes); |
19 | | - } |
20 | | - |
21 | | - private Map<Integer, Node> createDisjointSets(int[] array) { |
22 | | - final Map<Integer, Node> result = new HashMap<>(); |
23 | | - for (int element : array) { |
24 | | - if (result.containsKey(element)) continue; |
25 | | - |
26 | | - Node current = new Node(); |
27 | | - |
28 | | - if (result.containsKey(element - 1)) { |
29 | | - Node left = result.get(element - 1); |
30 | | - left.next = current; |
31 | | - current.previous = left; |
32 | | - } |
33 | | - |
34 | | - if (result.containsKey(element + 1)) { |
35 | | - Node right = result.get(element + 1); |
36 | | - current.next = right; |
37 | | - right.previous = current; |
38 | | - } |
39 | | - |
40 | | - result.put(element, current); |
41 | | - } |
42 | | - |
43 | | - return result; |
44 | | - } |
45 | | - |
46 | | - private int longestConsecutiveSequenceLength(Map<Integer, Node> nodes) { |
47 | | - final Set<Node> processedNodes = new HashSet<>(); |
| 10 | + final Set<Integer> numbers = setFrom(nums); |
48 | 11 | int maxLength = 0; |
49 | 12 |
|
50 | | - for (Node node : nodes.values()) { |
51 | | - int length = getLength(node, processedNodes); |
52 | | - maxLength = Math.max(maxLength, length); |
| 13 | + for (int number : numbers) { |
| 14 | + if (!numbers.contains(number - 1)) { |
| 15 | + int length = 1; |
| 16 | + for (int i = number + 1 ; numbers.contains(i) ; i++) { |
| 17 | + length++; |
| 18 | + } |
| 19 | + maxLength = Math.max(maxLength, length); |
| 20 | + } |
53 | 21 | } |
54 | 22 |
|
55 | 23 | return maxLength; |
56 | 24 | } |
57 | 25 |
|
58 | | - private int getLength(Node node, Set<Node> processedNodes) { |
59 | | - if (node == null) return 0; |
60 | | - if (processedNodes.contains(node)) return 0; |
61 | | - processedNodes.add(node); |
62 | | - return 1 + getLength(node.previous, processedNodes) + getLength(node.next, processedNodes); |
| 26 | + private Set<Integer> setFrom(int[] array) { |
| 27 | + final Set<Integer> set = new HashSet<>(); |
| 28 | + for (int element : array) { |
| 29 | + set.add(element); |
| 30 | + } |
| 31 | + return set; |
63 | 32 | } |
64 | 33 | } |
0 commit comments