《九日集训》第七日贪心算法

一、今日知识点总结

  1. 什么是贪心算法,做出当前看来最好的选择。找当前最优解,所有的最优解,合并起来得整体最优解(这个是不一定的,得具体分析)。

二、今日做题记录

第一题

1913,两个数对之间的最大乘积差

两个数对 (a, b) 和 (c, d) 之间的 乘积差 定义为 (a * b) - (c * d) 。

例如,(5, 6) 和 (2, 7) 之间的乘积差是 (5 * 6) - (2 * 7) = 16 。
给你一个整数数组 nums ,选出四个 不同的 下标 w、x、y 和 z ,使数对 (nums[w], nums[x]) 和 (nums[y], nums[z]) 之间的 乘积差 取到 最大值 。

返回以这种方式取得的乘积差中的 最大值 。

思路:差要最大,被减数最大,减少最小。将数组升序排列后,最大两数乘积为后两位乘积,最小为前两位乘积。

int com(const void* p1,const void* p2){
    return (*(int *)p1)-(*(int *)p2);
}

int maxProductDifference(int* nums, int numsSize){

    qsort(nums,numsSize,sizeof(int),com);
    return nums[numsSize-1]*nums[numsSize-2]-nums[0]*nums[1];
}

第二题

976.三角形最大周长

昨天已经做过,就不写了。

第三题

561,数组拆分

给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。

返回该 最大总和 。

思路:所有数的和已经定了,要想分成n组,然后丢去每组中最大的值,要想最后的和最大,丢弃尽可能小的值就能满足条件了。对数据进行升序排列,任意一个数,比它大的最小的数就是它的下一个数。那将其两两分组,丢掉的都是相对,较小数的最小损失了。

int com(const void*p1,const void*p2){
    return (*(int *)p1)-(*(int *)p2);
}
int min(int a,int b){
    return a<b?a:b;
}
int arrayPairSum(int* nums, int numsSize){
    qsort(nums,numsSize,sizeof(int),com);
    int left,right,sum;
    left = 0;
    right = 1;
    sum = 0;
    while(right<numsSize){
        sum += min(nums[left],nums[right]);
        left +=2;
        right+=2;
    }
    return sum;

}

第四题

881,救生艇

也是上一天的题,就不写了。

第五题

324,摆动排序

给你一个整数数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]… 的顺序。

你可以假设所有输入数组都可以得到满足题目要求的结果。

int com(const void*p1,const void*p2){
    return (*(int *)p1)-(*(int *)p2);
}
void wiggleSort(int* nums, int numsSize){
    qsort(nums,numsSize,sizeof(int),com);

    int *result =  (int*)malloc(sizeof(int)*numsSize);
    int i,left,right;
    left = 0;
    right = numsSize-1;
    for(i=1;i<numsSize;i+=2){
        result[i]=nums[right];
        right--;
    }
    for(i=0;i<numsSize;i+=2){
        result[i] = nums[right];
        right--;
    }
    for (i = 0;i<numsSize;i++){
        nums[i] = result[i];
    }
}

你可能感兴趣的:(贪心算法,算法,leetcode)