Maximize array sum after K negations | Set 2

07 Jul, 2021
Given an array of size n and a number k. We must modify array K number of times. Here modify array means in each operation we can replace any array element arr[i] by -arr[i]. We need to perform this operation in such a way that after K operations, sum of array must be maximum?
Examples: 
Input : arr[] = {-2, 0, 5, -1, 2} 
        K = 4
Output: 10
// Replace (-2) by -(-2), array becomes {2, 0, 5, -1, 2}
// Replace (-1) by -(-1), array becomes {2, 0, 5, 1, 2}
// Replace (0) by -(0), array becomes {2, 0, 5, 1, 2}
// Replace (0) by -(0), array becomes {2, 0, 5, 1, 2}

Input : arr[] = {9, 8, 8, 5} 
        K = 3
Output: 20
We have discussed a O(nk) solution in below post.Maximize array sum after K negations | Set 1The idea used in above post is to replace the minimum element arr[i] in array by -arr[i] for current operation. In this way we can make sum of array maximum after K operations. Once interesting case is, once minimum element becomes 0, we don’t need to make any more changes.The implementation used in above solution uses linear search to find minimum element. The time complexity of the above discussed solution is O(nk)In this post an optimized solution is implemented that uses a priority queue (or binary heap) to find minimum element quickly. 
Below is the implementation of the idea. It uses PriorityQueue class in Java.
C++
Java
// A PriorityQueue based C++ program to// maximize array sum after k negations.#include <bits/stdc++.h>using namespace std; // Function to find Maximum sum// after K negationsint MaxSum(int a[], int n, int k){    int sum = 0;         // Create a min heap for priority queue    priority_queue<int, vector<int>, greater<int>> pq;     // Insert all elements in f array in priority_queue    for(int i = 0; i < n; i++)    {        pq.push(a[i]);    }     while (k--)    {                 // Retrieve and remove min element        int temp = pq.top();         pq.pop();                 // Modify the minimum element and        // add back to priority queue        temp = (temp) * -1;        pq.push(temp);    }         // Calculate the sum    while (!pq.empty())    {        sum = sum + pq.top();        pq.pop();    }    return sum;} // Driver Codeint main(){    int a[] = { -2, 0, 5, -1, 2 };    int n = sizeof(a) / sizeof(a[0]);    int k = 4;     cout << MaxSum(a, n, k);    return 0;} // This code is contributed by Harshit Srivastava
// A PriorityQueue based Java program to maximize array// sum after k negations.import java.util.*; class maximizeSum{    public static int maxSum(int[] a, int k)    {        // Create a priority queue and insert all array elements        // int        PriorityQueue<Integer> pq = new PriorityQueue<>();        for (int x : a)            pq.add(x);         // Do k negations by removing a minimum element k times        while (k-- > 0)        {            // Retrieve and remove min element            int temp = pq.poll();             // Modify the minimum element and add back            // to priority queue            temp *= -1;            pq.add(temp);        }         // Compute sum of all elements in priority queue.        int sum = 0;        for (int x : pq)            sum += x;        return sum;    }     // Driver code    public static void main (String[] args)    {        int[] arr = {-2, 0, 5, -1, 2};        int k = 4;        System.out.println(maxSum(arr, k));    }}
Output:  
10
This article is contributed by Prakhar. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
AmanKumar63
srivastavaharshit848
Arrays
Greedy
Arrays
Greedy
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Maximum and minimum of an array using minimum number of comparisons
Top 50 Array Coding Problems for Interviews
Multidimensional Arrays in Java
Stack Data Structure (Introduction and Program)
Linear Search
Dijkstra's shortest path algorithm | Greedy Algo-7
Prim’s Minimum Spanning Tree (MST) | Greedy Algo-5
Write a program to print all permutations of a given string
Kruskal’s Minimum Spanning Tree Algorithm | Greedy Algo-2
Huffman Coding | Greedy Algo-3