贪心算法|1005.K次取反后最大化的数组和

力扣题目链接

class Solution {
static bool cmp(int a, int b) {
    return abs(a) > abs(b);
}
public:
    int largestSumAfterKNegations(vector<int>& A, int K) {
        sort(A.begin(), A.end(), cmp);       // 第一步
        for (int i = 0; i < A.size(); i++) { // 第二步
            if (A[i] < 0 && K > 0) {
                A[i] *= -1;
                K--;
            }
        }
        if (K % 2 == 1) A[A.size() - 1] *= -1; // 第三步
        int result = 0;
        for (int a : A) result += a;        // 第四步
        return result;
    }
};

有没有不理解的语法知识呢?

http://t.csdnimg.cn/gC8Is

sort函数中的比较函数cmp(),即void sort( iterator start, iterator end, StrictWeakOrdering cmp );
sort函数头文件为:#include <algorithm>
其中,cmp函数可以自己编写,自己决定逻辑,包括cmp的命名也是自己决定的。

示例如下:

bool cmp(int a ,int b)
{
	return a < b ;		从小到大排序,把 < 换成 > 就是从大到小 
}

sort(p.begin(), p.end(), cmp);

 代码随想录 (programmercarl.com)

思路

本题思路其实比较好想了,如何可以让数组和最大呢?

贪心的思路,局部最优:让绝对值大的负数变为正数,当前数值达到最大,整体最优:整个数组和达到最大。

局部最优可以推出全局最优。

那么如果将负数都转变为正数了,K依然大于0,此时的问题是一个有序正整数序列,如何转变K次正负,让 数组和 达到最大。

那么又是一个贪心:局部最优:只找数值最小的正整数进行反转,当前数值和可以达到最大(例如正整数数组{5, 3, 1},反转1 得到-1 比 反转5得到的-5 大多了),全局最优:整个 数组和 达到最大。

虽然这道题目大家做的时候,可能都不会去想什么贪心算法,一鼓作气,就AC了。

我这里其实是为了给大家展现出来 经常被大家忽略的贪心思路,这么一道简单题,就用了两次贪心!

那么本题的解题步骤为:

  • 第一步:将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小
  • 第二步:从前向后遍历,遇到负数将其变为正数,同时K--
  • 第三步:如果K还大于0,那么反复转变数值最小的元素,将K用完
  • 第四步:求和

自己的思路:

1.求K次取反后的最大和,贪心负数最小的先取反。所以先将数组的绝对值从大到小排序。

2.遍历

if (A[i] < 0 && K > 0) {
                A[i] *= -1;
                K--;
            }

3.当数组全部为正数时,还存在k为奇数时,贪心,将 最小的正数取反

4.全部累加

最近更新

  1. TCP协议是安全的吗?

    2024-04-09 07:26:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-09 07:26:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-09 07:26:05       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-09 07:26:05       20 阅读

热门阅读

  1. 详解Oracle数据库的检查点(Checkpoint)

    2024-04-09 07:26:05       12 阅读
  2. 设计模式之迭代器模式

    2024-04-09 07:26:05       12 阅读
  3. verilog 和 system verilog 有什么区别?

    2024-04-09 07:26:05       13 阅读
  4. 一些考研经验

    2024-04-09 07:26:05       19 阅读
  5. Rust 实战练习 - 9. 文本编码,URL编码,加密解密

    2024-04-09 07:26:05       12 阅读
  6. 10.枚举

    10.枚举

    2024-04-09 07:26:05      15 阅读
  7. uniapp 检查更新

    2024-04-09 07:26:05       11 阅读
  8. 新型基础设施建设(新基建)

    2024-04-09 07:26:05       11 阅读
  9. golang 使用 cipher、aes 实现 oauth2 验证

    2024-04-09 07:26:05       11 阅读
  10. MySQL视图及如何导入导出

    2024-04-09 07:26:05       13 阅读
  11. 【IP层的校验和与UDP的校验和】+【FPGA实现】

    2024-04-09 07:26:05       12 阅读