leetcode.945.是数组唯一的最小增量
关于这道题,我一开始的的想法就是用hash表来做,用hash表逐个记录a表的数据,然后如果遇到重复的就网上move1,但是到最后时间限制总是不达标。因此,只能使用路径压缩法,但是路径压缩法也有问题,那就是同时使用的i不够大的问题,因此当数值大且多时,还是会超,但是最后定了个十万,总算达标。
前hash表超时代码:
int i,hash[50000]={0},cnt=0;
if(ASize==0)
return 0;
for(i=0;i<ASize;i++){
if(hash[A[i]]==0)
hash[A[i]]=1;
else{
while(hash[A[i]]!=0){
A[i]++;
cnt++;
}
hash[A[i]]=1;
}
}
return cnt;
然后是路径压缩法:
int i,hash[100000]={0},cnt=0;
if(ASize<=1)
return 0;
for(i=0;i<ASize;i++)
hash[A[i]]++;
for(i=0;i<100000;i++){
if(hash[i]<=1)continue;
cnt+=hash[i]-1;
hash[i+1]+=hash[i]-1;
hash[i]=1;
}
return cnt;