Queries to find the minimum array sum possible by removing elements from either end
Last Updated :
10 Nov, 2021
Given an array arr[] consisting of N distinct integers and an array Q[] representing queries, the task for every query Q[i] is to find the minimum sum possible by removing the array elements from either end until Q[i] is obtained.
Examples:
Input: arr[] = {2, 3, 6, 7, 4, 5, 1}, Q[] = {7, 6}
Output: 17 11
Explanation:
Query 1: By popping elements from the end, sum = 1 + 5 + 4 + 7 = 17.
Query 2: Popping elements from the front, sum = 2 + 3 + 6 = 11.
Input: arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, Q[] = {4, 6, 3}
Output: 10 21 6
Naive Approach: The simplest approach to solve the given problem is to traverse the given array from both the ends for each query Q[i] and print the minimum sum obtained from both the traversals till the element with value Q[i] is obtained.
Below is the implementation of the above approach:
C++14
#include <bits/stdc++.h>
using namespace std;
void minSum( int arr[], int N, int Q[],
int M)
{
for ( int i = 0; i < M; i++) {
int val = Q[i];
int front = 0, rear = 0;
for ( int j = 0; j < N; j++) {
front += arr[j];
if (arr[j] == val) {
break ;
}
}
for ( int j = N - 1; j >= 0; j--) {
rear += arr[j];
if (arr[j] == val) {
break ;
}
}
cout << min(front, rear) << " " ;
}
}
int main()
{
int arr[] = { 2, 3, 6, 7, 4, 5, 1 };
int N = sizeof (arr) / sizeof (arr[0]);
int Q[] = { 7, 6 };
int M = sizeof (Q) / sizeof (Q[0]);
minSum(arr, N, Q, M);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static void minSum( int arr[], int N, int Q[],
int M)
{
for ( int i = 0 ; i < M; i++)
{
int val = Q[i];
int front = 0 , rear = 0 ;
for ( int j = 0 ; j < N; j++)
{
front += arr[j];
if (arr[j] == val)
{
break ;
}
}
for ( int j = N - 1 ; j >= 0 ; j--)
{
rear += arr[j];
if (arr[j] == val)
{
break ;
}
}
System.out.print(Math.min(front, rear) + " " );
}
}
public static void main(String[] args)
{
int arr[] = { 2 , 3 , 6 , 7 , 4 , 5 , 1 };
int N = arr.length;
int Q[] = { 7 , 6 };
int M = Q.length;
minSum(arr, N, Q, M);
}
}
|
Python3
def minSum(arr, N, Q, M):
for i in range (M):
val = Q[i]
front, rear = 0 , 0
for j in range (N):
front + = arr[j]
if (arr[j] = = val):
break
for j in range (N - 1 , - 1 , - 1 ):
rear + = arr[j]
if (arr[j] = = val):
break
print ( min (front, rear), end = " " )
if __name__ = = '__main__' :
arr = [ 2 , 3 , 6 , 7 , 4 , 5 , 1 ]
N = len (arr)
Q = [ 7 , 6 ]
M = len (Q)
minSum(arr, N, Q, M)
|
C#
using System;
class GFG{
static void minSum( int [] arr, int N, int [] Q,
int M)
{
for ( int i = 0; i < M; i++)
{
int val = Q[i];
int front = 0, rear = 0;
for ( int j = 0; j < N; j++)
{
front += arr[j];
if (arr[j] == val)
{
break ;
}
}
for ( int j = N - 1; j >= 0; j--)
{
rear += arr[j];
if (arr[j] == val)
{
break ;
}
}
Console.Write(Math.Min(front, rear) + " " );
}
}
static public void Main()
{
int [] arr = { 2, 3, 6, 7, 4, 5, 1 };
int N = arr.Length;
int [] Q = { 7, 6 };
int M = Q.Length;
minSum(arr, N, Q, M);
}
}
|
Javascript
<script>
function minSum(arr, N, Q, M)
{
for ( var i = 0; i < M; i++) {
var val = Q[i];
var front = 0, rear = 0;
for ( var j = 0; j < N; j++) {
front += arr[j];
if (arr[j] == val) {
break ;
}
}
for ( var j = N - 1; j >= 0; j--) {
rear += arr[j];
if (arr[j] == val) {
break ;
}
}
document.write( Math.min(front, rear) + " " );
}
}
var arr = [ 2, 3, 6, 7, 4, 5, 1 ];
var N = arr.length;
var Q = [ 7, 6 ];
var M = Q.length;
minSum(arr, N, Q, M);
</script>
|
Time Complexity: O(N*M)
Auxiliary Space: O(1)
Efficient Approach: To optimize the above approach, the idea is to use the Prefix Sum technique to solve this problem. Follow the steps below to solve the problem:
- Create two auxiliary Maps, say M1 and M2.
- Traverse the array from the front and insert the current sum calculated till each index in the Map M1 along with the element.
- Similarly, traverse the array from the back and insert the current sum calculated till each index in the map M2 along with the element.
- Traverse the array Q[] and for each element Q[i], print minimum of M1[Q[i]] and M2[Q[i]] as the minimum possible sum.
Below is the implementation of the above approach:
C++14
#include <bits/stdc++.h>
using namespace std;
void minOperations( int arr[], int N,
int Q[], int M)
{
map< int , int > m1, m2;
int front = 0, rear = 0;
for ( int i = 0; i < N; i++) {
front += arr[i];
m1.insert({ arr[i], front });
}
for ( int i = N - 1; i >= 0; i--) {
rear += arr[i];
m2.insert({ arr[i], rear });
}
for ( int i = 0; i < M; i++) {
cout << min(m1[Q[i]], m2[Q[i]])
<< " " ;
}
}
int main()
{
int arr[] = { 2, 3, 6, 7, 4, 5, 1 };
int N = sizeof (arr) / sizeof (arr[0]);
int Q[] = { 7, 6 };
int M = sizeof (Q) / sizeof (Q[0]);
minOperations(arr, N, Q, M);
return 0;
}
|
Java
import java.util.*;
class GFG{
static void minOperations( int [] arr, int N,
int [] Q, int M)
{
Map<Integer,
Integer> m1 = new HashMap<Integer,
Integer>();
Map<Integer,
Integer> m2 = new HashMap<Integer,
Integer>();
int front = 0 , rear = 0 ;
for ( int i = 0 ; i < N; i++)
{
front += arr[i];
m1.put(arr[i], front);
}
for ( int i = N - 1 ; i >= 0 ; i--)
{
rear += arr[i];
m2.put(arr[i], rear);
}
for ( int i = 0 ; i < M; i++)
{
System.out.print(Math.min(m1.get(Q[i]),
m2.get(Q[i])) + " " );
}
}
public static void main(String[] args)
{
int [] arr = { 2 , 3 , 6 , 7 , 4 , 5 , 1 };
int N = arr.length;
int [] Q = { 7 , 6 };
int M = Q.length;
minOperations(arr, N, Q, M);
}
}
|
Python3
def minOperations(arr, N, Q, M):
m1 = {}
m2 = {}
front = 0
rear = 0
for i in range (N):
front + = arr[i]
m1[arr[i]] = front
for i in range (N - 1 , - 1 , - 1 ):
rear + = arr[i]
m2[arr[i]] = rear
for i in range (M):
print ( min (m1[Q[i]], m2[Q[i]]),end = " " )
arr = [ 2 , 3 , 6 , 7 , 4 , 5 , 1 ]
N = len (arr)
Q = [ 7 , 6 ]
M = len (Q)
minOperations(arr, N, Q, M)
|
C#
using System;
using System.Collections.Generic;
class GFG{
static void minOperations( int [] arr, int N,
int [] Q, int M)
{
Dictionary< int ,
int > m1 = new Dictionary< int ,
int >();
Dictionary< int ,
int > m2 = new Dictionary< int ,
int >();
int front = 0, rear = 0;
for ( int i = 0; i < N; i++)
{
front += arr[i];
m1[arr[i]] = front;
}
for ( int i = N - 1; i >= 0; i--)
{
rear += arr[i];
m2[arr[i]] = rear;
}
for ( int i = 0; i < M; i++)
{
Console.Write(Math.Min(m1[Q[i]],
m2[Q[i]]) + " " );
}
}
public static void Main()
{
int [] arr = { 2, 3, 6, 7, 4, 5, 1 };
int N = arr.Length;
int [] Q = { 7, 6 };
int M = Q.Length;
minOperations(arr, N, Q, M);
}
}
|
Javascript
<script>
function minOperations(arr, N, Q, M)
{
var m1 = new Map();
var m2 = new Map();
var front = 0, rear = 0;
var i;
for (i = 0; i < N; i++) {
front += arr[i];
m1.set(arr[i],front);
}
for (i = N - 1; i >= 0; i--) {
rear += arr[i];
m2.set(arr[i], rear);
}
for (i = 0; i < M; i++) {
document.write(Math.min(m1.get(Q[i]), m2.get(Q[i])) + " " );
}
}
var arr = [2, 3, 6, 7, 4, 5, 1];
var N = arr.length;
var Q = [7, 6];
var M = Q.length;
minOperations(arr, N, Q, M);
</script>
|
Time Complexity: O(N + M)
Auxiliary Space: O(N)
Share your thoughts in the comments
Please Login to comment...