第一题


思路:升序排列后取最优情况
第二题


思路:让升序排列从左开始相邻两项一起
第三题

思路:原本想的是判断最轻的两个人能否坐上,但贪心应该考虑符合情况的最优情况,即从重的开始考虑,如果最重的连最轻的也不能一起坐,那么最重的一定自己坐
运用双指针,从末尾开始考虑,如果最重的人和最轻的人也不能一起坐,那么必然自己做,cnt++,r--(最重的排除),可以一起坐就cnt++,l++,r--,循环到l<=r为止,l==r就说明只剩一个人,cnt++
int cmp(const void* a, const void* b)
{
return *(int *)a-*(int *)b;
}
int numRescueBoats(int* people, int peopleSize, int limit){
int l=0;
int r=peopleSize-1;//双指针
int cnt=0;
qsort(people,peopleSize,sizeof(int),cmp);
while(l<=r)
{
if(l==r)
{
cnt++;
return cnt;
}
else{
if(people[r]+people[l]<=limit)
{
cnt++;
l++;
r--;
}
else{
cnt++;
r--;
}
}
}
return cnt;
}
第四题

思路:复制一个nums数组,奇偶分类插元素
重点:若想在for循环中表现循环或者想要的递增递减步长与for循环步长不同,则可以在for循环中使用r--,如上图,i每次加2,r每次减一
第五题

int cmp(const void *a, const void *b) {
return *(int *)a - *(int *)b;
}
int findContentChildren(int* g, int gSize, int* s, int sSize){
qsort(g, gSize, sizeof(int), cmp);
qsort(s, sSize, sizeof(int), cmp);
int l=sSize-1;//s也就是饼干的指针
int r=gSize-1;//g也就是胃口的指针
int cnt=0;
while(l>=0&&r>=0)
{
if(s[l]>=g[r])
{
cnt++;
l--;
r--;
}
else{
r--;
}
}
return cnt;
}
思路:

贪心算法就是从局部最优到全局最优,
所以局部最优是让最大的饼干满足胃口最大的小孩,所以双指针
两个都指向饼干和胃口的 末尾,如果不能满足,则让胃口--,因为最大的饼干也无法满足他
第六题

int cmp(const void* a, const void* b)
{
return *(int *)a-*(int *)b;
}
int minIncrementForUnique(int* nums, int numsSize){
int cnt=0;
int curmax=-1;;//pre表示前一个数,即下一个数要比较的数,所以要+1
qsort(nums,numsSize,sizeof(int),cmp);
for(int i=0;i<numsSize;i++)
{
if(nums[i]<=curmax)//当前数字要比最大值还要大一才能不同
{
curmax++;
cnt+=curmax-nums[i];
}
else{
curmax=nums[i];//更新最大值
}
}
return cnt;
}
思路:先升序排列,记录curmax,无须将数组中每个元素改变,只需记录次数,注意判断条件是num[i]<=curmax,每次循环之后要更新curmax
总结:贪心算法就是局部最优到全局最优的过程,往往与升序排列和双指针有关
本文介绍了如何利用贪心策略和升序排列解决五道编程问题,涉及数组操作、最优化分配、双指针技巧。核心在于理解局部最优到全局最优的思路,并展示了如何运用qsort和双指针技巧优化解决方案。
1165

被折叠的 条评论
为什么被折叠?



