哈希表 01

169 阅读1分钟

LeetCode 128

原题链接

代码如下:

import java.util.HashSet;
import java.util.Set;

/**
 * 哈希表
 * 
 * 传统的暴力,两层for来找最大连续序列,但其中有可优化的地方,外层循环中,子序列除了第一个元素 
 * 后面的元素其实不用再判断一遍,肯定比最大值小,因为没算上第一个数
 * 所以在找枚举开头数x之前,先判断它的前一个数x-1 是否在集合当中,不在就可以开始更新结果
 * 
 * 首先先借助HashSet对原数组的元素进行去重,再开始从外层将集合从头到尾遍历一遍
 * 不断更新结果值,最后找到最大连续子序列的长度
 * 
 * Code by java
 */

class Solution {
	public int longestConsecutive(int[] nums) {
		Set<Integer> numsSet = new HashSet<Integer>();
		for (int num : nums) {
			numsSet.add(num); // HashSet去重
		}

		int longestNum = 0; // 存储结果

		for (int num : numsSet) {
			if (!numsSet.contains(num - 1)) { // 当前数字的上一个数不在集合内,可以开始往上更新结果值
				int curNum = num; // 保存当前数,等下往上遍历
				int curLongest = 1; // 从该数开始构成的最大连续序列

				while (numsSet.contains(curNum + 1)) {
					curNum++;
					curLongest++;
				}

				longestNum = Math.max(longestNum, curLongest); // 更新结果值
			}
		}
		return longestNum;
	}

	public static void main(String[] args) {
		Solution a = new Solution();
		int[] k = new int[] { 100, 4, 200, 1, 3, 2 };
		System.out.println(a.longestConsecutive(k));
	}
}