1005.E. Maximize Sum Of Array After K Negations

该博客讨论了LeetCode问题1005,内容涉及如何在进行K次元素取负操作后最大化数组的和。作者提出了两种策略:当K小于等于负数的数量时,翻转最小的K个负数;当K大于负数的数量时,考虑K与负数数量之差的奇偶性来决定操作。文章提供了C++和Python的实现,并表达了对LeetCode题目数量增长的感慨。
摘要由CSDN通过智能技术生成

一个数组每次选一个*(-1),K次后求最大sum。

desc

思路:

1. 维护最小堆,either in place or not.

2. 细分析负数数量和K奇偶.

  • K<=#负数:翻转最小的K个负数
  • K>#负数:翻转所有负数
    • (K-#负数)为偶,res=sum
    • (K-#负数)为奇,res=sum-min*2

C++

heap

class Solution {
public:
    int largestSumAfterKNegations(vector<int>& A, int K) {
        multiset<int> s;
        int res = 0;
        
        for (auto x: A) {
            s.insert(x);
            res += x;
        }
        while(K--) {
            int tmp = *s.begin();
            s.erase(s.begin());
            s.insert(tmp * -1);
            res = res - tmp*2;
        }
        return res;
    }
};
class Solution {
public:
    int largestSumAfterKNegations(vector<int>& A, int K) {
        int res = 0;
        int cnt = 0;
        sort(A.begin(), A.end());
        int min_v;
        
        for (int i=0; i<A.size(); i++) {
            if (A[i]<0 && cnt++<K) 
                A[i] = -A[i];
            min_v = min(min_v, A[i]);
            res += A[i];
        }
        if ((cnt > K) || (K-cnt)%2 == 0)
            return res;
        return res - 2 * min_v;
    }
};

Python

class Solution(object):
    def largestSumAfterKNegations(self, A, K):
        """
        :type A: List[int]
        :type K: int
        :rtype: int
        """
        s = sum(A)
        heapq.heapify(A)
        while K > 0:
            min_v = heapq.heappop(A)
            heapq.heappush(A, -min_v)
            K = K-1
            s += -2*min_v
        return s
class Solution(object):
    def largestSumAfterKNegations(self, A, K):
        for _ in range(K):
            A.sort()
            A[0]=-A[0]
        return sum(A)
class Solution(object):
    def largestSumAfterKNegations(self, A, K):
        A.sort()
        i = 0
        while i<len(A) and i<K and A[i]<0:
            A[i] = -A[i]
            i += 1
        if (K-i) % 2:
            return sum(A)-min(A)*2
        return sum(A)

 

碎碎念:

遥想第一次刷lc的时候才只有一百多题啊一百多,今天打开看着标号1500+...真的是一脸懵逼+绝望...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值