Maximum possible middle element of the array after deleting exactly k elements
Given an integer array of size n and a number k. If the indexing is 1 based then the middle element of the array is the element at index (n + 1) / 2, if n is odd otherwise n / 2. The task is to delete exactly k elements from the array in such a way that the middle element of the reduced array is as maximum as possible. Find the maximum possible middle element of the array after deleting exactly k elements.
Examples:
Input :
n = 5, k = 2
arr[] = {9, 5, 3, 7, 10};
Output : 7
Input :
n = 9, k = 3
arr[] = {2, 4, 3, 9, 5, 8, 7, 6, 10};
Output : 9
In the first input, if we delete 5 and 3 then the array becomes {9, 7, 10} and
the middle element will be 7.
In the second input, if we delete one element before 9 and two elements after 9
(for example 2, 5, 8) then the array becomes {4, 3, 9, 7, 6, 10} and middle
element will be 9 and it will be the optimum solution.
Naive Approach :
The naive approach is to check all possible solutions. There could be C(n, k) possible solutions. If we check all possible solutions to find an optimal solution, it will consume a lot of time.
Optimal Approach :
After deleting k elements, the array will be reduced to size n – k. Since we can delete any k numbers from the array to find the maximum possible middle elements. If we note, the index of the middle element after deleting k elements will lie in the range ( n + 1 – k ) / 2 and ( n + 1 – k ) / 2 + k. So in order to find the optimal solution, simply iterate the array from the index ( n + 1 – k ) / 2 to index ( n + 1 – k ) / 2 + k and select the maximum element in this range.
The is the implementation is given below.
C++
#include <bits/stdc++.h>
using namespace std;
int maximum_middle_value( int n, int k, int arr[])
{
int ans = -1;
int low = (n + 1 - k) / 2;
int high = (n + 1 - k) / 2 + k;
for ( int i = low; i <= high; i++) {
ans = max(ans, arr[i - 1]);
}
return ans;
}
int main()
{
int n = 5, k = 2;
int arr[] = { 9, 5, 3, 7, 10 };
cout << maximum_middle_value(n, k, arr) << endl;
n = 9;
k = 3;
int arr1[] = { 2, 4, 3, 9, 5, 8, 7, 6, 10 };
cout << maximum_middle_value(n, k, arr1) << endl;
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int maximum_middle_value( int n, int k, int arr[])
{
int ans = - 1 ;
int low = (n + 1 - k) / 2 ;
int high = (n + 1 - k) / 2 + k;
for ( int i = low; i <= high; i++)
{
ans = Math.max(ans, arr[i - 1 ]);
}
return ans;
}
public static void main(String args[])
{
int n = 5 , k = 2 ;
int arr[] = { 9 , 5 , 3 , 7 , 10 };
System.out.println( maximum_middle_value(n, k, arr));
n = 9 ;
k = 3 ;
int arr1[] = { 2 , 4 , 3 , 9 , 5 , 8 , 7 , 6 , 10 };
System.out.println( maximum_middle_value(n, k, arr1));
}
}
|
Python3
def maximum_middle_value(n, k, arr):
ans = - 1
low = (n + 1 - k) / / 2
high = (n + 1 - k) / / 2 + k
for i in range (low, high + 1 ):
ans = max (ans, arr[i - 1 ])
return ans
if __name__ = = "__main__" :
n, k = 5 , 2
arr = [ 9 , 5 , 3 , 7 , 10 ]
print (maximum_middle_value(n, k, arr))
n, k = 9 , 3
arr1 = [ 2 , 4 , 3 , 9 , 5 , 8 , 7 , 6 , 10 ]
print (maximum_middle_value(n, k, arr1))
|
C#
using System;
class GFG
{
static int maximum_middle_value( int n, int k, int []arr)
{
int ans = -1;
int low = (n + 1 - k) / 2;
int high = (n + 1 - k) / 2 + k;
for ( int i = low; i <= high; i++)
{
ans = Math.Max(ans, arr[i - 1]);
}
return ans;
}
static public void Main ()
{
int n = 5, k = 2;
int []arr = { 9, 5, 3, 7, 10 };
Console.WriteLine( maximum_middle_value(n, k, arr));
n = 9;
k = 3;
int []arr1 = { 2, 4, 3, 9, 5, 8, 7, 6, 10 };
Console.WriteLine( maximum_middle_value(n, k, arr1));
}
}
|
Javascript
<script>
function maximum_middle_value(n, k, arr)
{
let ans = -1;
let low = Math.floor((n + 1 - k) / 2);
let high = Math.floor(((n + 1 - k) / 2) + k);
for (let i = low; i <= high; i++) {
ans = Math.max(ans, arr[i - 1]);
}
return ans;
}
let n = 5, k = 2;
let arr = [ 9, 5, 3, 7, 10 ];
document.write(maximum_middle_value(n, k, arr) + "<br>" );
n = 9;
k = 3;
let arr1 = [ 2, 4, 3, 9, 5, 8, 7, 6, 10 ];
document.write(maximum_middle_value(n, k, arr1) + "<br>" );
</script>
|
Time Complexity: O(high-low), where high and low are the terms calculated
Auxiliary Space: O(1), as no extra space is used
Last Updated :
09 Jun, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...