Longest Consecutive Sequence

来源:互联网 发布:轩辕剑符鬼进阶数据 编辑:程序博客网 时间:2024/06/03 18:21

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.


answer:

We will use HashMap. The key thing is to keep track of(记录) the sequence length and store that in the boundary(边界) points of the sequence. For example, as a result, for sequence {1, 2, 3, 4, 5}, map.get(1) and map.get(5) should both return 5.因为下一次肯能有连接的时候只会和边界的值进行连接,所以能够达到准确记录sequence的长度问题

Whenever a new element n is inserted into the map, do two things:

  1. See if n - 1 and n + 1 exist in the map, and if so, it means there is an existing sequence next to n. Variables left and right will be the length of those two sequences, while0 means there is no sequence and n will be the boundary point later. Store (left + right + 1) as the associated value to key n into the map.
  2. Use left and right to locate the other end of the sequences to the left and right of n respectively, and replace the value with the new length.

Everything inside the for loop is O(1) so the total time is O(n). Please comment if you see something wrong. Thanks.

public int longestConsecutive(int[] num) {    int res = 0;    HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();    for (int n : num) {        if (!map.containsKey(n)) {            int left = (map.containsKey(n - 1)) ? map.get(n - 1) : 0;            int right = (map.containsKey(n + 1)) ? map.get(n + 1) : 0;            // sum: length of the sequence n is in            int sum = left + right + 1;            map.put(n, sum);                        // keep track of the max length             res = Math.max(res, sum);                        // extend(延长) the length to the boundary(s)            // of the sequence            // will do nothing if n has no neighbors            map.put(n - left, sum);            map.put(n + right, sum);        }        else {            // duplicates            continue;        }    }    return res;}
总结:当需要o(n)复杂度时,应该了解题意后,考虑到边界值或者最大值和最小值。
0 0
原创粉丝点击