给定一个由N 个正整数和一个整数K组成的数组arr[] ,任务是在精确删除K 个元素后最小化给定数组中最大和最小元素之间的差异。
例子:
Input: arr[] = {5, 1, 6, 7, 12, 10}, K = 3
Output: 2
Explanation:
Remove elements 12, 10 and 1 from the given array.
The array modifies to {5, 6, 7}.
The difference between the minimum and maximum element is 7 – 5 = 2.
Input: arr[] = {14, 5, 61, 10, 21, 12, 54}, K = 4
Output: 4
Explanation:
Remove elements 61, 54, 5 and 21 from the given array.
The array modifies to {14, 10, 12}.
The difference between the minimum and maximum element is 14 – 10 = 4.
方法:解决给定问题的想法是通过删除数组中的最小元素或数组中的最大元素来最小化差异。请按照以下步骤解决问题:
- 按升序对数组arr[]进行排序。
- 初始化变量left = 0和right = (N – 1) 。
- 迭代K次,根据以下条件将最大值或最小值改为0:
- 如果arr[right – 1] – arr[left] < arr[right] – arr[left + 1] ,则将arr[right]更改为0并将右指针递减1 。
- 否则,变化ARR [左]为0,递增1左指针。
- 在上述步骤之后,在左和右索引的元素之间的差异是所要求的最小差。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
#include
using namespace std;
// Function to minimize the difference
// of the maximum and minimum array
// elements by removing K elements
void minimumRange(int arr[], int N, int K)
{
// Base Condition
if (K >= N)
{
cout << 0;
return;
}
// Sort the array
sort(arr, arr + N);
// Initialize left and right pointers
int left = 0, right = N - 1, i;
// Iterate for K times
for (i = 0; i < K; i++)
{
// Removing right element
// to reduce the difference
if (arr[right - 1] - arr[left]
< arr[right] - arr[left + 1])
right--;
// Removing the left element
// to reduce the difference
else
left++;
}
// Print the minimum difference
cout << arr[right] - arr[left];
}
// Driver Code
int main()
{
int arr[] = { 5, 10, 12, 14, 21, 54, 61 };
int N = sizeof(arr) / sizeof(arr[0]);
int K = 4;
// Function Call
minimumRange(arr, N, K);
return 0;
}
Java
// Java program for the above approach
import java.util.*;
class GFG{
// Function to minimize the difference
// of the maximum and minimum array
// elements by removing K elements
static void minimumRange(int arr[], int N,
int K)
{
// Base Condition
if (K >= N)
{
System.out.print(0);
return;
}
// Sort the array
Arrays.sort(arr);
// Initialize left and right pointers
int left = 0, right = N - 1, i;
// Iterate for K times
for(i = 0; i < K; i++)
{
// Removing right element
// to reduce the difference
if (arr[right - 1] - arr[left] <
arr[right] - arr[left + 1])
right--;
// Removing the left element
// to reduce the difference
else
left++;
}
// Print the minimum difference
System.out.print(arr[right] - arr[left]);
}
// Driver Code
public static void main(String[] args)
{
int arr[] = { 5, 10, 12, 14, 21, 54, 61 };
int N = arr.length;
int K = 4;
// Function Call
minimumRange(arr, N, K);
}
}
// This code is contributed by 29AjayKumar
Python3
# Python3 program for the above approach
# Function to minimize the difference
# of the maximum and minimum array
# elements by removing K elements
def minimumRange(arr, N, K) :
# Base Condition
if (K >= N) :
print(0, end = '');
return;
# Sort the array
arr.sort();
# Initialize left and right pointers
left = 0; right = N - 1;
# Iterate for K times
for i in range(K) :
# Removing right element
# to reduce the difference
if (arr[right - 1] - arr[left] < arr[right] - arr[left + 1]) :
right -= 1;
# Removing the left element
# to reduce the difference
else :
left += 1;
# Print the minimum difference
print(arr[right] - arr[left], end = '');
# Driver Code
if __name__ == "__main__" :
arr = [ 5, 10, 12, 14, 21, 54, 61 ];
N = len(arr);
K = 4;
# Function Call
minimumRange(arr, N, K);
# This code is contributed by AnkitRai01
C#
// C# program for the above approach
using System;
class GFG{
// Function to minimize the difference
// of the maximum and minimum array
// elements by removing K elements
static void minimumRange(int []arr, int N,
int K)
{
// Base Condition
if (K >= N)
{
Console.Write(0);
return;
}
// Sort the array
Array.Sort(arr);
// Initialize left and right pointers
int left = 0, right = N - 1, i;
// Iterate for K times
for(i = 0; i < K; i++)
{
// Removing right element
// to reduce the difference
if (arr[right - 1] - arr[left] <
arr[right] - arr[left + 1])
right--;
// Removing the left element
// to reduce the difference
else
left++;
}
// Print the minimum difference
Console.Write(arr[right] - arr[left]);
}
// Driver Code
public static void Main(String[] args)
{
int []arr = { 5, 10, 12, 14, 21, 54, 61 };
int N = arr.Length;
int K = 4;
// Function Call
minimumRange(arr, N, K);
}
}
// This code is contributed by 29AjayKumar
Javascript
4
时间复杂度: O(N*log N)
辅助空间: O(1)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。