给定一个由N 个元素组成的数组arr[] ,任务是从数组的末尾删除最少数量的元素,使数组的总和至少减少K 。请注意, K将始终小于或等于数组所有元素的总和。
例子:
Input: arr[] = {1, 11, 5, 5}, K = 11
Output: 2
After removing two elements form the left
end, the sum decreases by 1 + 11 = 12.
Thus, the answer is 2.
Input: arr[] = {1, 2, 3}, K = 6
Output: 3
方法:基于动态编程的方法已经在另一篇文章中讨论过。在本文中,将讨论使用双指针技术的方法。可以观察到,任务是找到最长的子数组,其元素之和最大为sum(arr) – K ,其中sum(arr)是数组arr[]中所有元素的总和。
设此类子数组的长度为L 。因此,要从数组中删除的最小元素数将等于N – L。要查找此类子数组的最长长度,请参阅本文。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
// Function to return the count of minimum
// elements to be removed from the ends
// of the array such that the sum of the
// array decrease by at least K
int minCount(int* arr, int n, int k)
{
// To store the final answer
int ans = 0;
// Maximum possible sum required
int sum = 0;
for (int i = 0; i < n; i++)
sum += arr[i];
sum -= k;
// Left point
int l = 0;
// Right pointer
int r = 0;
// Total current sum
int tot = 0;
// Two pointer loop
while (l < n) {
// If the sum fits
if (tot <= sum) {
// Update the answer
ans = max(ans, r - l);
if (r == n)
break;
// Update the total sum
tot += arr[r++];
}
else {
// Increment the left pointer
tot -= arr[l++];
}
}
return (n - ans);
}
// Driver code
int main()
{
int arr[] = { 1, 11, 5, 5 };
int n = sizeof(arr) / sizeof(int);
int k = 11;
cout << minCount(arr, n, k);
return 0;
}
Java
// Java implementation of the approach
class GFG
{
// Function to return the count of minimum
// elements to be removed from the ends
// of the array such that the sum of the
// array decrease by at least K
static int minCount(int arr[],
int n, int k)
{
// To store the final answer
int ans = 0;
// Maximum possible sum required
int sum = 0;
for (int i = 0; i < n; i++)
sum += arr[i];
sum -= k;
// Left point
int l = 0;
// Right pointer
int r = 0;
// Total current sum
int tot = 0;
// Two pointer loop
while (l < n)
{
// If the sum fits
if (tot <= sum)
{
// Update the answer
ans = Math.max(ans, r - l);
if (r == n)
break;
// Update the total sum
tot += arr[r++];
}
else
{
// Increment the left pointer
tot -= arr[l++];
}
}
return (n - ans);
}
// Driver code
public static void main (String[] args)
{
int arr[] = { 1, 11, 5, 5 };
int n = arr.length;
int k = 11;
System.out.println(minCount(arr, n, k));
}
}
// This code is contributed by AnkitRai01
Python3
# Python3 implementation of the approach
# Function to return the count of minimum
# elements to be removed from the ends
# of the array such that the sum of the
# array decrease by at least K
def minCount(arr, n, k) :
# To store the final answer
ans = 0;
# Maximum possible sum required
sum = 0;
for i in range(n) :
sum += arr[i];
sum -= k;
# Left point
l = 0;
# Right pointer
r = 0;
# Total current sum
tot = 0;
# Two pointer loop
while (l < n) :
# If the sum fits
if (tot <= sum) :
# Update the answer
ans = max(ans, r - l);
if (r == n) :
break;
# Update the total sum
tot += arr[r];
r += 1
else :
# Increment the left pointer
tot -= arr[l];
l += 1
return (n - ans);
# Driver code
if __name__ == "__main__" :
arr = [ 1, 11, 5, 5 ];
n = len(arr);
k = 11;
print(minCount(arr, n, k));
# This code is contributed by AnkitRai01
C#
// C# implementation of the approach
using System;
class GFG
{
// Function to return the count of minimum
// elements to be removed from the ends
// of the array such that the sum of the
// array decrease by at least K
static int minCount(int []arr,
int n, int k)
{
// To store the final answer
int ans = 0;
// Maximum possible sum required
int sum = 0;
for (int i = 0; i < n; i++)
sum += arr[i];
sum -= k;
// Left point
int l = 0;
// Right pointer
int r = 0;
// Total current sum
int tot = 0;
// Two pointer loop
while (l < n)
{
// If the sum fits
if (tot <= sum)
{
// Update the answer
ans = Math.Max(ans, r - l);
if (r == n)
break;
// Update the total sum
tot += arr[r++];
}
else
{
// Increment the left pointer
tot -= arr[l++];
}
}
return (n - ans);
}
// Driver code
public static void Main()
{
int []arr = { 1, 11, 5, 5 };
int n = arr.Length;
int k = 11;
Console.WriteLine(minCount(arr, n, k));
}
}
// This code is contributed by AnkitRai01
Javascript
输出:
2
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。