Given an unsorted array of integers, find the length of the longest consecutive elements sequence.
For example,
Given
The longest consecutive elements sequence is
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(nlogn) + O(n) = O(nlogn)
用hashset存储所有的数 这样查找时间为O(1),
对于数组中每个数我们要找大于和小于他的数 例如当前数组是2 我们就要查找有没有1 和3, 如果有了3了, 那么继续找4.
所以我们对于数组中的每个数都在hashset中找他的上下边界 找到后就在set中删除然后继续查找, 维护一个max 最后返回最长的连续
我们对于数组中每个数都进行一次查找, 查找的时间复杂度是O(1) 所以最后复杂度是O(n)
用hashset存储所有的数 这样查找时间为O(1),
对于数组中每个数我们要找大于和小于他的数 例如当前数组是2 我们就要查找有没有1 和3, 如果有了3了, 那么继续找4.
所以我们对于数组中的每个数都在hashset中找他的上下边界 找到后就在set中删除然后继续查找, 维护一个max 最后返回最长的连续
我们对于数组中每个数都进行一次查找, 查找的时间复杂度是O(1) 所以最后复杂度是O(n)
public class Solution { public int longestConsecutive(int[] nums) { if (nums == null || nums.length == 0) { return 0; } HashSet<Integer> set = new HashSet<Integer>(); for (int i = 0; i < nums.length; i++) { set.add(nums[i]); } int max = 0; for (int i = 0; i < nums.length; i++) { if (set.contains(nums[i])) { int count = 1; set.remove(nums[i]); int low = nums[i] - 1; int high = nums[i] + 1; while (set.contains(low)) {//找下边界 set.remove(low); count++; low--; } while (set.contains(high)) {//找上边界 set.remove(high); count++; high++; } max = Math.max(max, count); } } return max; } }
没有评论:
发表评论