2023.7.30
本题思路如下:
- 按绝对值大小将数组进行从大到小的排序。
- 遍历数组,若当前元素为负数则修改其符号。
- 遍历完之后,判断k是否为奇数,若为奇数,则还需要修改一次符号,此时修改绝对值最小的那个数的符号,即数组最后一个元素。
- 将数组中的元素进行求和。
代码如下:
class Solution {
public:
static bool cmp(int a, int b)
{
return abs(a) > abs(b);
}
int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(),nums.end(),cmp);
for(int i=0; i<nums.size(); i++)
{
if(k>0 && 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。