问题:
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
我的思路及代码(有Bug未解决):
我的想法:先将数组排序(用的是归并排序法),再求最大长度。(但我没注意到要求算法的时间复杂度为O(n),这样做不符合题目要求,因此要用哈希表来做!)
我的程序 还有一个“溢出”的问题未解决!!!(下面贴图)
#include<stdio.h>
#include<stdlib.h>
int longestConsecutive(int* nums, int numsSize);
void main()
{
int nums[10]={6,4,7,1,3,2,9,10,11,12};
int numsSize=10;
int result;
result=longestConsecutive(nums,numsSize);
printf("最长连续序列的长度为 %d\n",result);
system("pause");
}
int longestConsecutive(int* nums, int numsSize)
{
if(nums[0]=='\0') //判断数组是否为空的方法!
{
return 0;
}
else
{
int tmp,m,n,k,len=1;
//int new_nums=(int)malloc(numsSize*sizeof(int)); //错误的!
int *new_nums=(int*)malloc(numsSize*sizeof(int)); //正确的!
//malloc的定义:malloc返回的是一个指针(一个地址),因此用malloc定义数组的时候都要定义指针型数组!
for(int i=0;i<numsSize/2-1;i++) //将数组nums的前一半排序
{
for(int j=i+1;j<numsSize/2;j++)
{
if(nums[i]>nums[j])
{
tmp=nums[i];
nums[i]=nums[j];
nums[j]=tmp;
}
}
}
for(int i=numsSize/2;i<numsSize-1;i++) //将数组nums的后一半排序
{
for(int j=i+1;j<numsSize;j++)
{
if(nums[i]>nums[j])
{
tmp=nums[i];
nums[i]=nums[j];
nums[j]=tmp;
}
}
}
for(m=numsSize/2-1,n=numsSize-1,k=numsSize-1;(m>=0)&&(n>=numsSize/2);) //归并排序
{
if(nums[m]>nums[n])
{
new_nums[k--]=nums[m--];
}
else
{
new_nums[k--]=nums[n--];
}
}
while(n>=numsSize/2)
{
new_nums[k--]=nums[n--];
}
for(int i=0;i<numsSize-1;i++) //求最大连续序列的长度(这里逻辑有点问题,以后修改!)
{
if(new_nums[i]==new_nums[i+1]-1)
len++;
}
free(new_nums);
return len;
}
}
执行结果正确,提交解答报错“溢出”:
知识点:
1. 给数组赋值时,该数组必须是指针型,不然会报错。(表达式必须包含指向对象的指针类型“”)
例如:下面这张图的定义方式就是错误的!应该是:int new_nums=(int *)malloc(numsSize*sizeof(int));
报错方式:
正确的赋值方式,函数形参里面定义时是int *!!!