当前位置: 首页 > news >正文

1005 K 次取反后最大化的数组和(贪心)

文章目录

  • 题目[](https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/)
  • 算法原理
  • 源码
  • 总结

题目

在这里插入图片描述
在这里插入图片描述
如上图,k是取反的次数,在数组【4,-1,3】中,当k = 1,把-2取反为2,和为9;在数组【3,-1,0,2】中,当k = 3,-1取反为1,再把2取反m-k=2次,还是2,和为6.

算法原理

分情况讨论:
设:整个数组中负数的个数是m 个
在这里插入图片描述

(1)m>k;把前k小负数,转化为正数(如下图)
在这里插入图片描述

(2)m==k,把所有的负数转化成正数(如下图)
在这里插入图片描述

(3)m<k;先把所有的负数变成正数;在根据k-m的奇偶性,偶数情况;直接忽略;奇数情况:挑选当前数组中最小的数,变成负数(如下图)。
在这里插入图片描述

源码

class Solution {
public:
    int largestSumAfterKNegations(vector<int>& nums, int k) {
        int  m =0,minElem = INT_MAX, n =nums.size();
        for(auto x :nums)
        {
            if(x < 0) m++;
            minElem = min(minElem,abs(x));//求绝对值最小的那个数
        }
      //分类讨论
      int ret = 0;
      if(m > k)
      {
        sort(nums.begin(),nums.end());
        for(int i = 0;i<k;i++)
        {
            ret+= -nums[i];
        }
        for(int i = k;i<n;i++)
        {
            ret+= nums[i];
        }
      }
      else
      {
        //把所有的负数变成正数
        for(auto x :nums) ret+=abs(x);
        if((k-m) % 2)
        {
          ret-=minElem*2;
        }
      }
      return ret;
    }
};

总结

以上就是1005 K 次取反后最大化的数组和(贪心),喜欢博主写的内容可以一键三连支持博主。

相关文章:

  • Electron通过ffi-napi调用dll导出接口
  • MacOS安装Emacs
  • 【Mermaid图表渲染错误分析与解决方案之关键字错误】
  • 读书笔记:要点提炼《基于大模型的RAG应用开发与优化——构建企业级LLM应用》(严灿平)
  • 计算机科学与技术
  • GPT2 模型训练
  • 本地文件共享——HFS
  • Linux线程池
  • 第3章 3.2 配置系统 .NET Core配置系统
  • 【C++委托与事件】函数指针,回调机制,事件式编程与松耦合的设计模式(上)
  • 孤独症项目(3)
  • 【开源】编译器,在线操作
  • 压力测试知识总结
  • DeepSeek动画视频全攻略:从架构到本地部署
  • Linux系统安全
  • 视觉分析之边缘检测算法
  • Python 将PPT幻灯片和形状转换为多种图片格式(JPG, PNG, BMP, SVG, TIFF)
  • 风险价值VaR、CVaR与ES
  • 基于Spark和Hive的酒店数据分析与推荐系统
  • 蓝桥杯好数
  • 我国首次实现地月距离尺度卫星激光测距
  • 国家市场监管总局:组织销毁侵权假冒服装、食药等3300吨
  • 人民论坛:是民生小事,也是融合大势
  • 何立峰出席跨境贸易便利化专项行动部署会并讲话
  • “两高”发布侵犯知产犯罪司法解释:降低部分犯罪入罪门槛
  • 苗旋已任民航局空管局局长、党委副书记