标签:hash nums int Leetcode945 high middle low 数组 增量
Every day a leetcode
题目来源:945. 使数组唯一的最小增量
解法1:hash计数
用一个hash表统计nums中各数字出现的次数。
设置count统计+1的次数。
遍历hash表,若hash[i]>1,说明有重复个数字,根据贪心的思想,应该将hash[i]-1个该值+1,则有:
count+=hash[i]-1;
hash[i+1]+=hash[i]-1;
hash[i]=1;
结果:
无论是int,还是long long,都溢出了。
解法2:快排+贪心
先将nums数组从小到大排序,依次对比相邻的两个数,若后一个数小于等于前一个数,说明要对后一个数做+1操作。
根据贪心的思想,只需要让后一个数比前一个数大1,就能让+1次数最少。
故+1次数为nums[i-1]-nums[i]+1,同时将nums[i修改为nums[i-1]+1。
代码:
void swap(int* a,int low,int high){
int c=a[low];
a[low]=a[high];
a[high]=c;
return;
}
int partition(int* a,int low,int high){
int pivotkey;
int middle=(low+high)/2;
if(a[low]>a[high]){
swap(a,low,high);
}
if(a[middle]>a[high]){
swap(a,middle,high);
}
if(a[middle]>a[low]){
swap(a,low,middle);
}
pivotkey=a[low];
while(low<high){
while(low<high&&a[high]>=pivotkey){
high--;
}
a[low]=a[high];
while(low<high&&a[low]<=pivotkey){
low++;
}
a[high]=a[low];
}
a[low]=pivotkey;
return low;
}
void quicksort(int* a,int low,int high){
int pivot;
while(low<high){
pivot=partition(a,low,high);
quicksort(a,low,pivot-1);
low=pivot+1;
}
return;
}
int minIncrementForUnique(int* nums, int numsSize){
int ans=0;
quicksort(nums,0,numsSize-1);
for(int i=1;i<numsSize;i++)
{
if(nums[i]<=nums[i-1])
{
ans+=nums[i-1]-nums[i]+1;
nums[i]=nums[i-1]+1;
}
}
return ans;
}
结果:
标签:hash,nums,int,Leetcode945,high,middle,low,数组,增量 来源: https://blog.csdn.net/ProgramNovice/article/details/123118681
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。