题目:
给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n)
的算法解决此问题。
示例 1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例 2:
输入:nums = [0,3,7,2,5,8,4,6,0,1] 输出:9
题目来源:LeetCode热题100
链接:128. 最长连续序列 - 力扣(LeetCode)
解题方法:先创建一个比较函数作为qsort函数的最后一个参数,用qsort函数对数组进行升序的快速排列,然后进行判断:元素是否连续,是否有重复元素,然后对连续元素长度采用取最长,出现重复元素则保持现有元素长度不变,出现新的连续元素长度则和之前的连续元素长度作比较。
int longestConsecutive(int* nums, int numsSize)
1、创建一个比较函数:
int compare(const void* elem1, const void* elem2) {
return *(int*)elem1 - *(int*)elem2;
}
2、使用qsort函数对数组进行升序的快速排列:
qsort(nums, numsSize, sizeof(int), compare);
具体实现代码如下:
//创建比较函数
int compare(const void* elem1, const void* elem2) {
return *(int*)elem1 - *(int*)elem2;
}
//算法实现
int longestConsecutive(int* nums, int numsSize){
int p = 1;//默认的最大连续序列数
int h = 0;//用来比较的连续序列数
int max = 0;//比较结果的最大值
//若数组长度为1
if (numsSize == 1 )
{
return 1;
}
//若数组长度为0
if(numsSize == 0)
return 0;
//用qsort函数进行升序的快速排列
qsort(nums, numsSize, sizeof(int), compare);
for (int i = 0; i < numsSize-1; i++)
{
if (nums[i] == nums[i + 1] - 1 )
{
p++;
}
else if (nums[i] == nums[i + 1] )//出现重复数字时
p = p;
else {
if (p > h) {
h = p;//将此次连续序列数赋值给h,继续找是否有更大的
p = 1;
}
else p = 1;
}
}
if(p == h)
max = p;
else max = (p>h)?p:h;
return max;
}