代码随想录训练营25day-贪心算法3

一、1005 k次取反后最大化数组

主要是用贪心的思维解决问题,达到训练的目的。题目中说明了必须要用k次,数组也有负数或者正数,怎么让数组最大化呢?

1 k次范围内,把所有的负数全部翻转,这样能够最大化;

2 如果还剩下次数k-n(n是负数的个数),那么怎么最大化呢?一开始思考时候,把最小的数字依次翻转,代价最小,但是这个思路是错误的,找到现在数组最小的元素,来回翻转(题目说同一个元素可以来回翻转),损失最多就是减少该值,这样代价才最小。

3 综合上面两个情况,这样能全局最优,获取最大的值。

void sortArr(int* nums, int numsSize)
{
    for(int i = 0; i < numsSize; i++)
    {
        for(int j = i + 1; j < numsSize;j++)
        {
            if(nums[i] > nums[j])
            {
                int tmp = nums[i];
                nums[i] = nums[j];
                nums[j] = tmp;
            }
        }
    }
}
int largestSumAfterKNegations(int* nums, int numsSize, int k) {
    int sum = 0;
    int pos = 0;
    if(numsSize <= 0)
    {
        return 0;
    }
    

你可能感兴趣的:(数据结构与算法,贪心算法,算法)