1. 程式人生 > 其它 >1005. K 次取反後最大化的陣列和

1005. K 次取反後最大化的陣列和

目錄

一.問題

給定一個整數陣列 A,我們只能用以下方法修改該陣列:我們選擇某個索引 i 並將 A[i] 替換為 -A[i],然後總共重複這個過程 K 次。(我們可以多次選擇同一個索引 i。)

以這種方式修改陣列後,返回陣列可能的最大和。

示例 1:
輸入:A = [4,2,3], K = 1
輸出:5
解釋:選擇索引 (1,) ,然後 A 變為 [4,-2,3]。

示例 2:
輸入:A = [3,-1,0,2], K = 3
輸出:6
解釋:選擇索引 (1, 2, 2) ,然後 A 變為 [3,1,0,2]。

示例 3:
輸入:A = [2,-3,-1,5,-4], K = 2

輸出:13
解釋:選擇索引 (1, 4) ,然後 A 變為 [2,3,-1,5,4]。

提示:

1 <= A.length <= 10000
1 <= K <= 10000
-100 <= A[i] <= 100

來源:力扣(LeetCode)
連結:題目描述

二.分析

(1)首先整理題意:我們要經過k次取反操作然後使得陣列和最大。

(2)要想使陣列和最大,那麼我們首先可以將負數變為正數,所以我們先對陣列從小到大進行排序。然後使用一個for迴圈,直到k次機會用完或者遍歷一遍完成後退出迴圈。

(3)接下來如果k次機會已經用完或者剩下機會是偶數個,那麼我們直接求和返回。反之,我們再對陣列進行一次排序(這時數組裡面的元素均為非負數),這個時候因為都是非負數,所以我們只要對最小的那個數操作就好了,因為上面已經排除了剩下偶數個機會的情況,所以此時將最小數直接取反求和返回即可。

三.程式碼

class Solution {
public:
    int largestSumAfterKNegations(vector<int>& nums, int k) {
        //先從小到大排一次序
        sort(nums.begin(),nums.end());
        //在k滿足的情況下將負數變為正數
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]<0 && k>0)
            {
                k--
; nums[i]=-nums[i]; } } if(k%2!=0) {sort(nums.begin(),nums.end());nums[0]=-nums[0];} //求和 int sum=0; for(int i=0;i<nums.size();i++) { sum+=nums[i]; } return sum; } };

在這裡插入圖片描述