首页 > 其他分享 >1005. K 次取反后最大化的数组和

1005. K 次取反后最大化的数组和

时间:2023-04-28 11:44:06浏览次数:39  
标签:最大化 begin return && nums int 取反 数组 1005

给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:

选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。
重复这个过程恰好 k 次。可以多次选择同一个下标 i 。

以这种方式修改数组后,返回数组 可能的最大和 。

输入:nums = [4,2,3], k = 1
输出:5
解释:选择下标 1 ,nums 变为 [4,-2,3] 。

> 我的解法

class Solution {
public:
    //取反的顺序为 负数、0、正数(优先级是小的优先)
    int largestSumAfterKNegations(vector<int>& nums, int k) {
        std::sort(nums.begin(),nums.end());
        int len = nums.size();
        int target = 0;
        if(*nums.begin() > 0){
            k = k%2;
            if(k == 1){
                nums[0] = -nums[0];
            }
        }
        else if(*nums.begin() < 0){
            auto iter = std::find(nums.begin(),nums.end(),0);
            if(iter == nums.end()){
                for(int i = 0;i < len && k > 0 && nums[i] < 0;i++){
                    nums[i] = - nums[i];
                    k--;
                }
                if(k > 0){
                    return largestSumAfterKNegations(nums,k);
                }
            }
            else{
                for(auto it = nums.begin();it != iter && k > 0; it++){
                    *it = -*it;
                    k--;
                }
            }
        }
        int sum = 0;
        for(const auto &a:nums){
            sum += a;
        }
        return sum;
    }
};

> 贪心解法

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;
    }
};

标签:最大化,begin,return,&&,nums,int,取反,数组,1005
From: https://www.cnblogs.com/lihaoxiang/p/17361667.html

相关文章

  • 菜鸟记录:c语言实现PAT甲级1005--Spell It Right
     非常简单的一题了,但还是交了两三次,原因:对数组的理解不足;对数字和字符之间的转换不够敏感。这将在下文中细说。Givenanon-negativeinteger N,yourtaskistocomputethesumofallthedigitsof N,andoutputeverydigitofthesuminEnglish.InputSpecificatio......
  • hdu 5441 长春区域赛网络赛 1005 Travel(并查集)
    题目链接:hdu5441题目大意:有一个n个点的无向图,给出m条边的边权,给出q次询问,每次给出一个值,求用到所有边权不大于这个值的边的情况下,能够互相到达的点对的个数(自己到自己不算)题目分析:首先我们对于边按照边权从小到大排序,对于询问按照值从小到大排序。枚举每次询问,从前到后扫描边,如果......
  • 如何衡量并最大化CDP的ROI?
    成功的客户体验计划最重要的秘密配方是什么?根据全球百位商业领导者的调研结果,答案是:优质的数据。随着去年数字技术普及的爆发,许多企业争相寻求适应数字化,数据质量成为了他们关注的头等大事。然而不幸的是,许多企业缺乏正确的技术来应对不断增长的客户数据量和复杂度。与此同时,许多......
  • Socket error Event: 32 Error: 10053.
    Xshell意外关闭可能会出现这种问题,如遇如下错误可解决:Connectingto47.106.80.28:22…Connectionestablished.Toescapetolocalshell,press‘Ctrl+Alt+]’.SocketerrorEvent:32Error:10053.Connectionclosing…Socketclose.Connectionclosedbyforeignhost.Dis......
  • C语言中,取反运算符~a=-(a+1)的原因
    1、因为计算机直接拿读取到的数据去运算付出的代价是最小的,所以计算机存储的数据的形式应该满足读取后不必经过任何加工就能直接用来运算由于原码不经加工无法实现(+a)+(-a)=0,所以不满足该要求,为了满足(+a)+(-a)=0的要求,人们设计出了补码来满足该要求因而计算机中存储数据的形式......
  • 期望最大化算法(EM)简介
    ExpectationMaximization,EM算法是带有隐变量的概率模型参数的极大似然估计(MLE为给定参数,观测数据出现/生成的可能性)。如下为《统计机器学习》中对应EM算法的笔记。观测数据Y和隐变量X合称,完全数据观测数据Y称,不完全数据E步:(期望步)求Q函数(上一轮参数固定,模型参数为变量的......
  • 1005--HBase操作实战(HBase Shell命令行模式)
    通过HBase命令行,创建一张表,用户存储用户信息,其中包括基本信息和额外信息HBaseshell下所有命令可以使用:help“cmd”进行了解1、创建表create't_person',{NAME=>'basic_info'},{NAME=>'extra_info'}2、表中存储数据put't_person','g201425001','ba......
  • C#原码,补码,反码以及取反
    在取反的二进制数中最高位是符号位(0代表正数,1代表负数)原码:将数值转化为2进制数,将最高位数转变为相对应的符号位反码:原码为正数的反码就是本身;原码为负数的反码就是符号位不变,其余数 0变1,1变0。补码:正数的补码就是本身;  负数的补码是反码符号位不变,最后一位+1......
  • C#原码,补码,反码以及取反
    在取反的二进制数中最高位是符号位(0代表正数,1代表负数)原码:将数值转化为2进制数,将最高位数转变为相对应的符号位反码:原码为正数的反码就是本身;原码为负数的反码就是符号位不变,其余数 0变1,1变0。补码:正数的补码就是本身;  负数的补码是反码符号位不变,最后一......
  • day 34 1005.K次取反后最大化的数组和 | 134. 加油站 | 135. 分发糖果
    1005.K次取反后最大化的数组和给定一个整数数组A,我们只能用以下方法修改该数组:我们选择某个索引i 并将A[i]替换为-A[i],然后总共重复这个过程K次。(我们可以多次选择同一个索引i。)以这种方式修改数组后,返回数组可能的最大和。示例1:输入:A=[4,2,3],K=1输出:5解释:......