给定一个非递减数组arr []和一个整数K ,任务是从数组中删除K个元素,以使相邻元素之间的最大差最小。 例子: Input: arr[] = {3, 7, 8, 10, 14}, K = 2 Input: arr[] = [12, 16, 22, 31, 31, 38], K = 3 方法1:蛮力这个想法是生成大小为N-K的数组的子集,并计算每个子序列中相邻元素的最大差值。最后,找到最大差异的最小值。 下面是上述方法的实现: 时间复杂度: O(2 N * N) 下面是上述方法的实现: 时间复杂度: O(N * K 2 ) 方法3:高效方法 下面是上述方法的实现: 时间复杂度: O(N)
注意: K
Output: 2
Explanation:
After removing elements A[0] and A[4],
The maximum difference between adjacent elements is minimum.
After removing elements, the remaining array is [7, 8, 10]
Output: 6
Explanation:
After removing elements A[3], A[4] and A[5],
The maximum difference between adjacent elements is minimum.
After removing elements, the remaining array is [12, 16, 22] C++
// C++ implementation to find the
// minimum of the maximum difference
// of the adjacent elements after
// removing K elements from the array
#include
Java
// Java implementation to find the
// minimum of the maximum difference
// of the adjacent elements after
// removing K elements from the array
import java.util.*;
class GFG{
// Function to find the minimum
// of the maximum difference of the
// adjacent elements after removing
// K elements from the array
static int minimumAdjacentDifference(int a[],
int n, int k)
{
// Intialising the
// minimum difference
int minDiff = Integer.MAX_VALUE;
// Traversing over subsets
// in iterative manner
for (int i = 0; i < (1 << n); i++) {
// Number of elements to
// be taken in the subset
// ON bits of i represent
// elements not to be removed
int cnt = Integer.bitCount(i);
// If the removed
// set is of size k
if (cnt == n - k) {
// Creating the new array
// after removing elements
Vector
Python3
# Python3 implementation to find the
# minimum of the maximum difference
# of the adjacent elements after
# removing K elements from the array
import sys
INT_MAX = sys.maxsize;
INT_MIN = -(sys.maxsize - 1)
# Function to find the minimum
# of the maximum difference of the
# adjacent elements after removing
# K elements from the array
def minimumAdjacentDifference(a, n, k) :
# Intialising the
# minimum difference
minDiff = INT_MAX;
# Traversing over subsets
# in iterative manner
for i in range( 1<
C#
// C# implementation to find the
// minimum of the maximum difference
// of the adjacent elements after
// removing K elements from the array
using System;
using System.Collections.Generic;
class GFG{
// Function to find the minimum
// of the maximum difference of the
// adjacent elements after removing
// K elements from the array
static int minimumAdjacentDifference(int []a,
int n, int k)
{
// Intialising the
// minimum difference
int minDiff = int.MaxValue;
// Traversing over subsets
// in iterative manner
for (int i = 0; i < (1 << n); i++) {
// Number of elements to
// be taken in the subset
// ON bits of i represent
// elements not to be removed
int cnt = countSetBits(i);
// If the removed
// set is of size k
if (cnt == n - k) {
// Creating the new array
// after removing elements
List
C++
// C++ implementation to find the
// minimum of the maximum difference
// of the adjacent elements after
// removing K elements from the array
#include
Java
// Java implementation to find the
// minimum of the maximum difference
// of the adjacent elements after
// removing K elements from the array
class GFG {
// Function to find the minimum
// of the maximum difference of the
// adjacent elements after removing
// K elements from the array
static int minimumAdjacentDifference(int a[],
int n, int k)
{
// Intialising the
// minimum difference
int minDiff = Integer.MAX_VALUE;
// Iterating over all
// subarrays of size n-k
for (int i = 0; i <= k; i++) {
// Maximum difference after
// removing elements
int maxDiff = Integer.MIN_VALUE;
for (int j = 0; j < n - k - 1; j++) {
for (int p = i; p <= i + j; p++) {
maxDiff = Math.max(maxDiff,
a[p + 1] - a[p]);
}
}
// Minimum Adjacent Difference
minDiff = Math.min(minDiff, maxDiff);
}
return minDiff;
}
// Driver Code
public static void main (String[] args)
{
int n = 5;
int k = 2;
int []a = { 3, 7, 8, 10, 14 };
System.out.println(minimumAdjacentDifference(a, n, k));
}
}
// This code is contributed by Yash_R
Python3
# Python3 implementation to find the
# minimum of the maximum difference
# of the adjacent elements after
# removing K elements from the array
import sys
INT_MAX = sys.maxsize;
INT_MIN = -(sys.maxsize - 1);
# Function to find the minimum
# of the maximum difference of the
# adjacent elements after removing
# K elements from the array
def minimumAdjacentDifference(a, n, k) :
# Intialising the
# minimum difference
minDiff = INT_MAX;
# Iterating over all
# subarrays of size n-k
for i in range(k + 1) :
# Maximum difference after
# removing elements
maxDiff = INT_MIN;
for j in range( n - k - 1) :
for p in range(i, i + j + 1) :
maxDiff = max(maxDiff, a[p + 1] - a[p]);
# Minimum Adjacent Difference
minDiff = min(minDiff, maxDiff);
return minDiff;
# Driver Code
if __name__ == "__main__" :
n = 5;
k = 2;
a = [ 3, 7, 8, 10, 14 ];
print(minimumAdjacentDifference(a, n, k));
# This code is contributed by AnkitRai01
C#
// C# implementation to find the
// minimum of the maximum difference
// of the adjacent elements after
// removing K elements from the array
using System;
class GFG {
// Function to find the minimum
// of the maximum difference of the
// adjacent elements after removing
// K elements from the array
static int minimumAdjacentDifference(int []a,
int n, int k)
{
// Intialising the
// minimum difference
int minDiff = int.MaxValue;
// Iterating over all
// subarrays of size n-k
for (int i = 0; i <= k; i++) {
// Maximum difference after
// removing elements
int maxDiff = int.MinValue;
for (int j = 0; j < n - k - 1; j++) {
for (int p = i; p <= i + j; p++) {
maxDiff = Math.Max(maxDiff,
a[p + 1] - a[p]);
}
}
// Minimum Adjacent Difference
minDiff = Math.Min(minDiff, maxDiff);
}
return minDiff;
}
// Driver Code
public static void Main (string[] args)
{
int n = 5;
int k = 2;
int []a = { 3, 7, 8, 10, 14 };
Console.WriteLine(minimumAdjacentDifference(a, n, k));
}
}
// This code is contributed by Yash_R
C++
// C++ implementation to find the
// minimum of the maximum difference
// of the adjacent elements after
// removing K elements from the array
#include
Java
// Java implementation to find the
// minimum of the maximum difference
// of the adjacent elements after
// removing K elements from the array
import java.util.*;
import java.lang.*;
class GFG{
// Function to find the minimum
// different in the subarrays
// of size K in the array
static int findKMin(int arr[], int n, int k)
{
// Create a Double Ended Queue, Qi
// that will store indexes
// of array elements, queue will
// store indexes of useful elements
// in every window
Deque
Python3
# Python3 implementation to find the
# minimum of the maximum difference
# of the adjacent elements after
# removing K elements from the array
import sys
# Function to find the minimum
# different in the subarrays
# of size K in the array
def findKMin(arr, n, k):
# Create a Double Ended Queue, Qi
# that will store indexes
# of array elements, queue will
# store indexes of useful elements
# in every window
Qi = []
# Process first k (or first window)
# elements of array
i = 0
for j in range(k):
# For every element,
# the previous smaller elements
# are useless so remove them from Qi
while ((len(Qi) != 0) and
arr[i] >= arr[Qi[-1]]):
Qi.pop() # Remove from rear
# Add new element at rear of queue
Qi.append(i)
i += 1
minDiff = sys.maxsize;
# Process rest of the elements,
# i.e., from arr[k] to arr[n-1]
for j in range(i, n):
# The element at the front
# of the queue is the largest
# element of previous window
minDiff = min(minDiff, arr[Qi[0]])
# Remove the elements
# which are out of this window
while ((len(Qi) != 0) and
Qi[0] <= i - k):
Qi.pop(0)
# Remove all elements smaller
# than the currently being
# added element (remove
# useless elements)
while ((len(Qi) != 0) and
arr[i] >= arr[Qi[-1]]):
Qi.pop()
# Add current element
# at the rear of Qi
Qi.append(i)
i += 1
# Compare the maximum
# element of last window
minDiff = min(minDiff, arr[Qi[0]])
return minDiff
# Function to find the minimum
# of the maximum difference of the
# adjacent elements after removing
# K elements from the array
def minimumAdjacentDifference(a, n, k):
# Create the difference array
diff = [0 for i in range(n - 1)]
for i in range(n - 1):
diff[i] = a[i + 1] - a[i]
# Find minimum of all maximum
# of subarray sizes n - k - 1
answer = findKMin(diff, n - 1,
n - k - 1)
return answer
# Driver code
if __name__=="__main__":
n = 5
k = 2
a = [ 3, 7, 8, 10, 14 ]
print(minimumAdjacentDifference(a, n, k))
# This code is contributed by rutvik_56
2
方法2:最佳方法
例如:Let the given array be {1, 5, 6},
If we remove the element 5(not the end element),
then the maximum difference will always increase.
Therefore, It is always better to remove end elements.
C++
// C++ implementation to find the
// minimum of the maximum difference
// of the adjacent elements after
// removing K elements from the array
#include
Java
// Java implementation to find the
// minimum of the maximum difference
// of the adjacent elements after
// removing K elements from the array
class GFG {
// Function to find the minimum
// of the maximum difference of the
// adjacent elements after removing
// K elements from the array
static int minimumAdjacentDifference(int a[],
int n, int k)
{
// Intialising the
// minimum difference
int minDiff = Integer.MAX_VALUE;
// Iterating over all
// subarrays of size n-k
for (int i = 0; i <= k; i++) {
// Maximum difference after
// removing elements
int maxDiff = Integer.MIN_VALUE;
for (int j = 0; j < n - k - 1; j++) {
for (int p = i; p <= i + j; p++) {
maxDiff = Math.max(maxDiff,
a[p + 1] - a[p]);
}
}
// Minimum Adjacent Difference
minDiff = Math.min(minDiff, maxDiff);
}
return minDiff;
}
// Driver Code
public static void main (String[] args)
{
int n = 5;
int k = 2;
int []a = { 3, 7, 8, 10, 14 };
System.out.println(minimumAdjacentDifference(a, n, k));
}
}
// This code is contributed by Yash_R
Python3
# Python3 implementation to find the
# minimum of the maximum difference
# of the adjacent elements after
# removing K elements from the array
import sys
INT_MAX = sys.maxsize;
INT_MIN = -(sys.maxsize - 1);
# Function to find the minimum
# of the maximum difference of the
# adjacent elements after removing
# K elements from the array
def minimumAdjacentDifference(a, n, k) :
# Intialising the
# minimum difference
minDiff = INT_MAX;
# Iterating over all
# subarrays of size n-k
for i in range(k + 1) :
# Maximum difference after
# removing elements
maxDiff = INT_MIN;
for j in range( n - k - 1) :
for p in range(i, i + j + 1) :
maxDiff = max(maxDiff, a[p + 1] - a[p]);
# Minimum Adjacent Difference
minDiff = min(minDiff, maxDiff);
return minDiff;
# Driver Code
if __name__ == "__main__" :
n = 5;
k = 2;
a = [ 3, 7, 8, 10, 14 ];
print(minimumAdjacentDifference(a, n, k));
# This code is contributed by AnkitRai01
C#
// C# implementation to find the
// minimum of the maximum difference
// of the adjacent elements after
// removing K elements from the array
using System;
class GFG {
// Function to find the minimum
// of the maximum difference of the
// adjacent elements after removing
// K elements from the array
static int minimumAdjacentDifference(int []a,
int n, int k)
{
// Intialising the
// minimum difference
int minDiff = int.MaxValue;
// Iterating over all
// subarrays of size n-k
for (int i = 0; i <= k; i++) {
// Maximum difference after
// removing elements
int maxDiff = int.MinValue;
for (int j = 0; j < n - k - 1; j++) {
for (int p = i; p <= i + j; p++) {
maxDiff = Math.Max(maxDiff,
a[p + 1] - a[p]);
}
}
// Minimum Adjacent Difference
minDiff = Math.Min(minDiff, maxDiff);
}
return minDiff;
}
// Driver Code
public static void Main (string[] args)
{
int n = 5;
int k = 2;
int []a = { 3, 7, 8, 10, 14 };
Console.WriteLine(minimumAdjacentDifference(a, n, k));
}
}
// This code is contributed by Yash_R
2
C++
// C++ implementation to find the
// minimum of the maximum difference
// of the adjacent elements after
// removing K elements from the array
#include
Java
// Java implementation to find the
// minimum of the maximum difference
// of the adjacent elements after
// removing K elements from the array
import java.util.*;
import java.lang.*;
class GFG{
// Function to find the minimum
// different in the subarrays
// of size K in the array
static int findKMin(int arr[], int n, int k)
{
// Create a Double Ended Queue, Qi
// that will store indexes
// of array elements, queue will
// store indexes of useful elements
// in every window
Deque
Python3
# Python3 implementation to find the
# minimum of the maximum difference
# of the adjacent elements after
# removing K elements from the array
import sys
# Function to find the minimum
# different in the subarrays
# of size K in the array
def findKMin(arr, n, k):
# Create a Double Ended Queue, Qi
# that will store indexes
# of array elements, queue will
# store indexes of useful elements
# in every window
Qi = []
# Process first k (or first window)
# elements of array
i = 0
for j in range(k):
# For every element,
# the previous smaller elements
# are useless so remove them from Qi
while ((len(Qi) != 0) and
arr[i] >= arr[Qi[-1]]):
Qi.pop() # Remove from rear
# Add new element at rear of queue
Qi.append(i)
i += 1
minDiff = sys.maxsize;
# Process rest of the elements,
# i.e., from arr[k] to arr[n-1]
for j in range(i, n):
# The element at the front
# of the queue is the largest
# element of previous window
minDiff = min(minDiff, arr[Qi[0]])
# Remove the elements
# which are out of this window
while ((len(Qi) != 0) and
Qi[0] <= i - k):
Qi.pop(0)
# Remove all elements smaller
# than the currently being
# added element (remove
# useless elements)
while ((len(Qi) != 0) and
arr[i] >= arr[Qi[-1]]):
Qi.pop()
# Add current element
# at the rear of Qi
Qi.append(i)
i += 1
# Compare the maximum
# element of last window
minDiff = min(minDiff, arr[Qi[0]])
return minDiff
# Function to find the minimum
# of the maximum difference of the
# adjacent elements after removing
# K elements from the array
def minimumAdjacentDifference(a, n, k):
# Create the difference array
diff = [0 for i in range(n - 1)]
for i in range(n - 1):
diff[i] = a[i + 1] - a[i]
# Find minimum of all maximum
# of subarray sizes n - k - 1
answer = findKMin(diff, n - 1,
n - k - 1)
return answer
# Driver code
if __name__=="__main__":
n = 5
k = 2
a = [ 3, 7, 8, 10, 14 ]
print(minimumAdjacentDifference(a, n, k))
# This code is contributed by rutvik_56
2