• Leetcode 1005. K 次取反后最大化的数组和(终于解决)


    在这里插入图片描述
    给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:

    • 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。

    重复这个过程恰好 k 次。可以多次选择同一个下标 i 。

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

    示例 1:

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

    示例 2:

    输入:nums = [3,-1,0,2], k = 3
    输出:6
    解释:选择下标 (1, 2, 2) ,nums 变为 [3,1,0,2] 。
    

    示例 3:

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

    提示:

    • 1 <= nums.length <= 10^4
    • -100 <= nums[i] <= 100
    • 1 <= k <= 10^4

    主要思路:
    1.先排序
    2.判断负数个数
    1)如果负数个数大于等于要反转的次数直接从最小值开始一次反转K次
    2)如果负数小于要反转的次数则先将所有负数转变为正数,然后排一次序,之后将剩余次数对2取余即可

    Code:

    class Solution {
    public:
        int largestSumAfterKNegations(vector<int>& nums, int k) {
            
            sort(nums.begin(),nums.end());
            int index=-1;
            int sum=0;
            bool flag=false;
            for(int i=0;i<nums.size();i++)
            {
                
                if(nums[i]>0)
                {
                    index=i;
                    break;
                }
            }
            if((index)>=k)//负数个数
            {
                
                for(int i=0;i<nums.size();i++)
                {
                    if(i<k)
                    {
                        sum-=nums[i];
                    }
                    else
                        sum+=nums[i];
                }
            }
            else
            {
                
                int cnt=0;
                for(int i=0;i<nums.size();i++)
                {
                    if(nums[i]>0)
                    {
                        break;
                    }
                    else
                    {
                        nums[i]=-nums[i];
                        cnt++;
                    }
                }
                sort(nums.begin(),nums.end());
                k=(k-cnt)%2;
                cout<<k<<endl;
                for(int i=0;i<nums.size();i++)
                {
                    if(i<k)
                    {
                        if(nums[i]==0)
                        {
                            k=0;
                        }
                        sum+=(-nums[i]);
                    }
                    else
                        sum+=nums[i];
                }
            }
            
            cout<<sum<<endl;
            return sum;
         
        }
    };
    
  • 相关阅读:
    程序清单 8-8 exec函数实例,a.out是程序8-9产生的可执行程序
    程序清单8-9 回送所有命令行参数和所有环境字符串
    程序清单8-3 8-4 演示不同的exit值
    C和指针 3.9作用域、存储类型示例
    程序4-6 utime函数实例
    程序4-5 打开一个文件,然后unlink
    C和指针笔记 3.8 static关键字
    C和指针笔记 3.7 存储类型
    C和指针笔记 3.6链接属性
    python爬虫<urlopen error [Errno 10061] >
  • 原文地址:https://www.cnblogs.com/xiaohai123/p/16291105.html
Copyright © 2020-2023  润新知