【LeetCode】NO.1005 K 次取反后最大化的数组和 (C++ & Python) [贪心算法]
题目
给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:
选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。
重复这个过程恰好 k 次。可以多次选择同一个下标 i 。
以这种方式修改数组后,返回数组 可能的最大和 。
思路
- 将数组按照绝对值从到小进行排序,每次先翻转绝对值较大的负数
- 当遍历一遍数组长度之和,所有数据都为正数,这个时候一直翻转最后一个最小的元素,知道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)
傻傻的在这里弄了好久,以为abs的问题,原来是在abs内的数组索引把i写出了1;太
傻le;
还以为是abs问题
特意到编译器打印一下:
总结
python 的 abs()函数
本文来自博客园,作者:jucw,转载请注明原文链接:https://www.cnblogs.com/Jucw/p/15734296.html