【LeetCode】NO.1005 K 次取反后最大化的数组和 (C++ & Python) [贪心算法]

题目

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

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

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

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

思路

  1. 将数组按照绝对值从到小进行排序,每次先翻转绝对值较大的负数
  2. 当遍历一遍数组长度之和,所有数据都为正数,这个时候一直翻转最后一个最小的元素,知道k=0

代码

class Solution {
        static bool cmp(int a, int b)
    {
        return abs(a)>abs(b);
    }
public:

    int largestSumAfterKNegations(vector<int>& nums, int k) {
        int sum = 0 ;
        //先排序,按照绝对值大的从大到小
        sort(nums.begin(), nums.end(), cmp);
        for(int i=0; i<nums.size();i++)
        {
            if(nums[i]<0 && k>0)
            {
                k--;
                nums[i] = abs(nums[i]);
            }

        }
        while(k>0)
        {
            nums[nums.size()-1] *= -1;
            k--;
        }
        for(int i=0;i<nums.size();i++)
        {
            sum += nums[i];
        }
        return sum;
    }
};

class Solution:
    def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
        nums = sorted(nums, key=abs, reverse=True) # 将A按绝对值从大到小排列
        for i in range(len(nums)):
            if k > 0 and nums[i] < 0:
                nums[i] *= -1
                k -= 1
        while(k>0):
            nums[-1] *= -1
            k -= 1
        return sum(nums)

image

傻傻的在这里弄了好久,以为abs的问题,原来是在abs内的数组索引把i写出了1;太 le;
还以为是abs问题
特意到编译器打印一下:
image

image

总结

python 的 abs()函数

posted @ 2021-12-26 21:56  jucw  阅读(69)  评论(0编辑  收藏  举报