【Leetcode】128. 最长连续序列

题目描述

【Leetcode】128. 最长连续序列


// 128. 最长连续序列

// 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在
// 原数组中连续)的长度。

// 进阶:你可以设计并实现时间复杂度为 O(n) 的解决方案吗?


题解

// 排序法
// 直接排序,res保存答案,count保存序列记录长度。
// for循环遍历nums的元素,记为nums[i],如果相邻两个元素nums[i]和nums[i-1]
// 相等,直接跳过(相当于去重)。
// 如果相邻两个元素nums[i]-nums[i-1]=1,数值正好差1,说明是同一个序列,
// count数量+1。如果相邻元素既不是相等,数值也不是差1。说明肯定是数值差了很多
// ,两个元素已经不在一个序列,则将记录的count拿来更新res。count重新置1。
// 最后结束时再拿count更新一下res,返回res。

// 执行用时:4 ms, 在所有 Java 提交中击败了86.98%的用户
// 内存消耗:38.8 MB, 在所有 Java 提交中击败了40.24%的用户
class Solution {
    public int longestConsecutive(int[] nums) {
		if (nums.length == 0)
			return 0;
		Arrays.sort(nums);
		int res = 0;
		int count = 1;
		for (int i = 1; i < nums.length; i++) {
			if (nums[i] == nums[i - 1]) 
				continue;
			else if (nums[i] - nums[i - 1] == 1) 
				count++;
			else {
				res = Math.max(res, count);
				count = 1;
			}
		}
		res = Math.max(res, count);
		return res;
    }
}



// Hashset方法。
// 
// 思路是一样的,相当于拿hashset去重了,每次遍历元素num时,如果num++也存在
// 在set中,count计数一次,如此循环。最后更新res。
// 执行用时:1212 ms, 在所有 Java 提交中击败了5.00%的用户
// 内存消耗:40.5 MB, 在所有 Java 提交中击败了5.00%的用户
import java.util.HashSet;
class Solution {
    public int longestConsecutive(int[] nums) {
        if (nums.length == 0)
            return 0;
		Set<Integer> set = new HashSet<>();
		int res = Integer.MIN_VALUE;
		for (int num: nums)
			set.add(num);
		for (int num: nums) {
			int count = 0;
			while (set.contains(num++)) {
				count++;
            }
			res = Math.max(res, count);
		}
		return res;
    }
}



// 优化一下,双O(n)的复杂度。
// 执行用时:373 ms, 在所有 Java 提交中击败了7.73%的用户
// 内存消耗:40 MB, 在所有 Java 提交中击败了10.25%的用户
import java.util.HashSet;
class Solution {
    public int longestConsecutive(int[] nums) {
		if (nums.length == 0)
            return 0;
		Set<Integer> set = new HashSet<>();
		int res = Integer.MIN_VALUE;
		for (int num: nums)
			set.add(num);
		for (int num: nums) {
			if (set.contains(num - 1))
				continue;
			else {
				int count = 0;
				while (set.contains(num++))
					count++;
				res = Math.max(res, count);
			}
		}
		return res;
    }
}

上一篇:ISO8583


下一篇:LVS:三种负载均衡方式比较