📌  相关文章
📜  通过添加最多K个元素来最大化具有相等元素的子数组的长度

📅  最后修改于: 2021-05-14 02:35:41             🧑  作者: Mango

给定一个数组arr [] ,该数组arr []N个正整数和一个整数K组成,整数K表示可以添加到数组元素的最大数量。任务是通过最多添加K来最大化相等元素的最长可能子数组的长度。

例子:

方法:请按照以下步骤解决问题:

  • 对数组arr []排序。然后,使用二进制搜索为具有相同元素的最大索引选择一个可能的值。
  • 对于每个picked_value,请使用“滑动窗口”技术检查是否有可能使所有元素对于大小为picked_value的数组相等
  • 最后,打印获得的子数组的最大可能长度。

下面是上述方法的实现:

C++14
// C++14 program for above approach
#include 
using namespace std;
 
// Function to check if a subarray of
// length len consisting of equal elements
// can be obtained or not
bool check(vector pSum, int len, int k,
           vector a)
{
     
    // Sliding window
    int i = 0;
    int j = len;
     
    while (j <= a.size())
    {
         
        // Last element of the sliding window
        // will be having the max size in the
        // current window
        int maxSize = a[j - 1];
 
        int totalNumbers = maxSize * len;
 
        // The current number of element in all
        // indices of the current sliding window
        int currNumbers = pSum[j] - pSum[i];
 
        // If the current number of the window,
        // added to k exceeds totalNumbers
        if (currNumbers + k >= totalNumbers)
        {
            return true;
        }
        else
        {
            i++;
            j++;
        }
    }
    return false;
}
 
// Function to find the maximum number of
// indices having equal elements after
// adding at most k numbers
int maxEqualIdx(vector arr, int k)
{
     
    // Sort the array in
    // ascending order
    sort(arr.begin(), arr.end());
 
    // Make prefix sum array
    vector prefixSum(arr.size());
    prefixSum[1] = arr[0];
 
    for(int i = 1;
            i < prefixSum.size() - 1; ++i)
    {
        prefixSum[i + 1] = prefixSum[i] +
                                 arr[i];
    }
 
    // Initialize variables
    int max = arr.size();
    int min = 1;
    int ans = 1;
 
    while (min <= max)
    {
         
        // Update mid
        int mid = (max + min) / 2;
 
        // Check if any subarray
        // can be obtained of length
        // mid having equal elements
        if (check(prefixSum, mid, k, arr))
        {
            ans = mid;
            min = mid + 1;
        }
        else
        {
             
            // Decrease max to mid
            max = mid - 1;
        }
    }
    return ans;
}
 
// Driver Code
int main()
{
    vector arr = { 1, 1, 1 };
    int k = 7;
 
    // Function call
    cout << (maxEqualIdx(arr, k));
}
 
// This code is contributed by mohit kumar 29


Java
// Java program for above approach
 
import java.util.*;
 
class GFG {
 
    // Function to find the maximum number of
    // indices having equal elements after
    // adding at most k numbers
    public static int maxEqualIdx(int[] arr,
                                  int k)
    {
        // Sort the array in
        // ascending order
        Arrays.sort(arr);
 
        // Make prefix sum array
        int[] prefixSum
            = new int[arr.length + 1];
        prefixSum[1] = arr[0];
 
        for (int i = 1; i < prefixSum.length - 1;
             ++i) {
 
            prefixSum[i + 1]
                = prefixSum[i] + arr[i];
        }
 
        // Initialize variables
        int max = arr.length;
        int min = 1;
        int ans = 1;
 
        while (min <= max) {
 
            // Update mid
            int mid = (max + min) / 2;
 
            // Check if any subarray
            // can be obtained of length
            // mid having equal elements
            if (check(prefixSum, mid, k, arr)) {
 
                ans = mid;
                min = mid + 1;
            }
            else {
 
                // Decrease max to mid
                max = mid - 1;
            }
        }
 
        return ans;
    }
 
    // Function to check if a subarray of
    // length len consisting of equal elements
    // can be obtained or not
    public static boolean check(int[] pSum,
                                int len, int k,
                                int[] a)
    {
 
        // Sliding window
        int i = 0;
        int j = len;
        while (j <= a.length) {
 
            // Last element of the sliding window
            // will be having the max size in the
            // current window
            int maxSize = a[j - 1];
 
            int totalNumbers = maxSize * len;
 
            // The current number of element in all
            // indices of the current sliding window
            int currNumbers = pSum[j] - pSum[i];
 
            // If the current number of the window,
            // added to k exceeds totalNumbers
            if (currNumbers + k >= totalNumbers) {
 
                return true;
            }
            else {
                i++;
                j++;
            }
        }
        return false;
    }
 
    // Driver Code
    public static void main(String[] args)
    {
 
        int[] arr = { 1, 1, 1 };
        int k = 7;
 
        // Function call
        System.out.println(maxEqualIdx(arr, k));
    }
}


Python3
# Python3 program for above approach
  
# Function to find the maximum number of
# indices having equal elements after
# adding at most k numbers
def maxEqualIdx(arr, k):
     
    # Sort the array in
    # ascending order
    arr.sort()
     
    # Make prefix sum array
    prefixSum = [0] * (len(arr) + 1)
    prefixSum[1] = arr[0]
  
    for i in range(1, len(prefixSum) - 1 ,1):
        prefixSum[i + 1] = prefixSum[i] + arr[i]
   
    # Initialize variables
    max = len(arr)
    min = 1
    ans = 1
  
    while (min <= max):
         
        # Update mid
        mid = (max + min) // 2
  
        # Check if any subarray
        # can be obtained of length
        # mid having equal elements
        if (check(prefixSum, mid, k, arr)):
            ans = mid
            min = mid + 1
        else:
             
            # Decrease max to mid
            max = mid - 1
     
    return ans
 
# Function to check if a subarray of
# length len consisting of equal elements
# can be obtained or not
def check(pSum, lenn, k, a):
     
    # Sliding window
    i = 0
    j = lenn
     
    while (j <= len(a)):
       
        # Last element of the sliding window
        # will be having the max size in the
        # current window
        maxSize = a[j - 1]
  
        totalNumbers = maxSize * lenn
  
        # The current number of element in all
        # indices of the current sliding window
        currNumbers = pSum[j] - pSum[i]
  
        # If the current number of the window,
        # added to k exceeds totalNumbers
        if (currNumbers + k >= totalNumbers):
            return True
     
        else:
            i += 1
            j += 1
     
    return False
 
# Driver Code
 
arr = [ 1, 1, 1 ]
k = 7
  
# Function call
print(maxEqualIdx(arr, k))
 
# This code is contributed by code_hunt


C#
// C# program for
// the above approach
using System;
class GFG{
 
// Function to find the maximum number of
// indices having equal elements after
// adding at most k numbers
public static int maxEqualIdx(int[] arr,
                              int k)
{
  // Sort the array in
  // ascending order
  Array.Sort(arr);
 
  // Make prefix sum array
  int[] prefixSum = new int[arr.Length + 1];
  prefixSum[1] = arr[0];
 
  for (int i = 1;
           i < prefixSum.Length - 1; ++i)
  {
    prefixSum[i + 1] = prefixSum[i] + arr[i];
  }
 
  // Initialize variables
  int max = arr.Length;
  int min = 1;
  int ans = 1;
 
  while (min <= max)
  {
    // Update mid
    int mid = (max + min) / 2;
 
    // Check if any subarray
    // can be obtained of length
    // mid having equal elements
    if (check(prefixSum, mid, k, arr))
    {
      ans = mid;
      min = mid + 1;
    }
    else
    {
      // Decrease max to mid
      max = mid - 1;
    }
  }
  return ans;
}
 
// Function to check if a subarray of
// length len consisting of equal elements
// can be obtained or not
public static bool check(int[] pSum,
                         int len, int k,
                         int[] a)
{
  // Sliding window
  int i = 0;
  int j = len;
  while (j <= a.Length)
  {
    // Last element of the sliding window
    // will be having the max size in the
    // current window
    int maxSize = a[j - 1];
 
    int totalNumbers = maxSize * len;
 
    // The current number of element in all
    // indices of the current sliding window
    int currNumbers = pSum[j] - pSum[i];
 
    // If the current number of the window,
    // added to k exceeds totalNumbers
    if (currNumbers + k >= totalNumbers)
    {
      return true;
    }
    else
    {
      i++;
      j++;
    }
  }
  return false;
}
 
// Driver Code
public static void Main(String[] args)
{
  int[] arr = {1, 1, 1};
  int k = 7;
 
  // Function call
  Console.WriteLine(maxEqualIdx(arr, k));
}
}
 
// This code is contributed by Rajput-Ji


输出:
3







时间复杂度: O(N * log N)
辅助空间: O(N)