题目要求O(n)
的时间复杂度,因此采用空间换时间的方法。
public int longestConsecutive(int[] nums) {
int ret = 0;
int n = nums.length;
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < n; i++)
map.put(nums[i], i);
int[] read = new int[n];
for (int i = 0; i < n; i++)
{
if (!map.containsKey(nums[i]-1)) // 注
{
int l = 1;
while (map.containsKey(nums[i] + l))
{
read[map.get(nums[i]+l)] = 1;
l++;
}
ret = ret > l ? ret : l;
}
}
return ret;
}
【注1】没有这一行判断的话会超时间;
if (read[i] == 0)
这一行代码和上述判断是同一个含义,也就是说加入序列的数字不需要再次进行判断了,但仅仅是这一行代码的不同,花费时间却是上述代码的两倍。
【注2】用上述判断的话,可以将HashMap
更改为HashSet
数据类型,花费时间会更少。