📌  相关文章
📜  至少要挑选K对同色的袜子数目最少

📅  最后修改于: 2021-04-27 21:44:14             🧑  作者: Mango

给定一个由N个整数组成的数组arr [] ,使得arr [i]代表颜色i的袜子数和一个整数K ,任务是找到要获得至少K对袜子所需的最小袜子数。相同颜色的袜子。

例子:

方法:可以根据以下观察结果解决给定问题:

  • 根据Pigeonhole的原理,即,在最坏的情况下,如果已挑选N根不同颜色的袜子,则下一次选中将形成一双匹配的袜子。
  • 假设一个人选了N根不同颜色的袜子,那么,对于每(K – 1)对,一个人就需要选两只袜子,一个用于形成一双袜子,另一只用于维护N种所有不同颜色的袜子,对于最后一对,则是只需要选择任何可用颜色的袜子即可。

因此,该想法是找到可以由相同颜色形成的对的总数,如果总数最多为K,则打印(2 * K + N – 1)作为要挑选的最小对的总数。否则,打印“ -1”,因为袜子不足以形成K对。

下面是上述方法的实现:

Java
// Java program for the above approach
  
import java.io.*;
  
class GFG {
  
    // Function to count the minimum
    // number of socks to be picked
    public static int findMin(
        int[] arr, int N, int k)
    {
        // Stores the total count
        // of pairs of socks
        int pairs = 0;
  
        // Find the total count of pairs
        for (int i = 0; i < N; i++) {
            pairs += arr[i] / 2;
        }
  
        // If K is greater than pairs
        if (k > pairs)
            return -1;
  
        // Otherwise
        else
            return 2 * k + N - 1;
    }
  
    // Driver Code
    public static void main(String[] args)
    {
        int[] arr = { 4, 5, 6 };
        int K = 3;
        int N = arr.length;
        System.out.println(findMin(arr, N, K));
    }
}


输出:
8

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