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

2023.7.30

leetcode 1005. K 次取反后最大化的数组和_第1张图片

        本题思路如下:

  1. 按绝对值大小将数组进行从大到小的排序。
  2. 遍历数组,若当前元素为负数则修改其符号。
  3. 遍历完之后,判断k是否为奇数,若为奇数,则还需要修改一次符号,此时修改绝对值最小的那个数的符号,即数组最后一个元素。
  4. 将数组中的元素进行求和。

        代码如下:

class Solution {
public:
    static bool cmp(int a, int b)
    {
        return abs(a) > abs(b);
    }
    int largestSumAfterKNegations(vector& nums, int k) {
        sort(nums.begin(),nums.end(),cmp);
        for(int i=0; i0 && nums[i]<0)
            {
                nums[i] *= -1;
                k--;
            }
        }
        if(k % 2 == 1)
        {
            nums[nums.size()-1] *= -1;
        }
        int sum = 0;
        for(int num : nums)
        {
            sum += num;
        }
        return sum;
    }
};

        需注意的是将cmp函数传递给sort函数时,需要将cmp定义为静态成员函数,在网上查找到的原因如下:

        普通类成员函数,都不能以函数指针的方式作为其他函数的入口参数,因为普通成员函数在编译阶段,会自动添加了入口参数,这样这个函数指针的模板其实就改变了。

        std::sort和std::stable_sort的作用域是全局的, 如果你定义的cmp在类内, 那就需要static, 如果在全局范围都有效, 那就不需要static。

你可能感兴趣的:(leetcode专栏,leetcode,算法,数据结构,c++)