📜  最大子集,M为最小缺失数

📅  最后修改于: 2021-05-17 02:03:30             🧑  作者: Mango

给定N个正整数和一个正整数M的数组arr [] ,任务是查找最长子集的长度,该子集的最小缺失整数为M。如果不存在这样的子集,则打印“ -1”
例子:

天真的方法:最简单的方法是生成给定数组的所有可能子集,并在最小缺失整数为M的那些子集中存储最大长度。最后,打印最大长度作为答案。

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

高效方法:
要优化上述方法,请考虑以下观察。如果数组中没有缺少小于M的元素,则最大子集的大小将为1,由除M之外的所有数组元素组成。否则,没有最小丢失数M的子集是不可能的。
请按照以下步骤操作:

  1. 将数组中除M之外的所有元素插入集合。
  2. 在数组arr []中找到不等于M的元素(例如, cnt )的频率。
  3. 在集合中找到最小的缺失数,如果它等于M ,则打印cnt的值作为子集的最大大小。
  4. 否则,请打印“ -1” ,因为没有任何子集,最小缺失数为M。

下面是上述方法的实现:

C++
// C++ Program to implement 
// the above approach 
  
#include  
#define ll long long int 
using namespace std; 
  
// Function to find and return the 
// length of the longest subset 
// whose smallest missing value is M 
ll findLengthOfMaxSubset(int arr[], 
                        int n, int m) 
{ 
    // Initialize a set 
    set s; 
  
    int answer = 0; 
  
    for (int i = 0; i < n; i++) { 
  
        int tmp = arr[i]; 
  
        // If array element is not 
        // equal to M 
        if (tmp != m) { 
  
            // Insert into set 
            s.insert(tmp); 
  
            // Increment frequency 
            answer++; 
        } 
    } 
  
    // Stores minimum missing 
    // number 
    int min = 1; 
  
    // Iterate to find the 
    // minimum missing 
    // integer 
    while (s.count(min)) { 
        min++; 
    } 
  
    // If minimum obtained 
    // is less than M 
    if (min != m) { 
  
        // Update answer 
        answer = -1; 
    } 
  
    // Return answer 
    return answer; 
} 
  
// Driver Code 
int main() 
{ 
    int arr[] = { 1, 2, 4 }; 
    int N = sizeof(arr) / sizeof(arr[0]); 
    int M = 3; 
  
    cout << findLengthOfMaxSubset( 
        arr, N, M); 
  
    return 0; 
}


Java
// Java program to implement 
// the above approach 
import java.util.*; 
  
class GFG{ 
      
// Function to find and return the 
// length of the longest subset 
// whose smallest missing value is M 
static int findLengthOfMaxSubset(int arr[], 
                                int n, int m) 
{ 
      
    // Initialize a set 
    Set s = new HashSet<>(); 
  
    int answer = 0; 
  
    for(int i = 0; i < n; i++) 
    { 
        int tmp = arr[i]; 
  
        // If array element is not 
        // equal to M 
        if (tmp != m) 
        { 
              
            // Insert into set 
            s.add(tmp); 
  
            // Increment frequency 
            answer++; 
        } 
    } 
      
    // Stores minimum missing 
    // number 
    int min = 1; 
  
    // Iterate to find the 
    // minimum missing 
    // integer 
    while (s.contains(min)) 
    { 
        min++; 
    } 
  
    // If minimum obtained 
    // is less than M 
    if (min != m) 
    { 
          
        // Update answer 
        answer = -1; 
    } 
  
    // Return answer 
    return answer; 
} 
  
// Driver code 
public static void main (String[] args) 
{ 
    int arr[] = { 1, 2, 4 }; 
    int N = arr.length; 
    int M = 3; 
      
    System.out.print(findLengthOfMaxSubset( 
        arr, N, M)); 
} 
} 
  
// This code is contributed by offbeat


Python3
# Python3 program to implement 
# the above approach 
  
# Function to find and return the 
# length of the longest subset 
# whose smallest missing value is M 
def findLengthOfMaxSubset(arr, n, m): 
      
    # Initialize a set 
    s = []; 
  
    answer = 0; 
  
    for i in range(n): 
        tmp = arr[i]; 
  
        # If array element is not 
        # equal to M 
        if (tmp != m): 
  
            # Insert into set 
            s.append(tmp); 
  
            # Increment frequency 
            answer += 1; 
  
    # Stores minimum missing 
    # number 
    min = 1; 
  
    # Iterate to find the 
    # minimum missing 
    # integer 
    while (s.count(min)): 
        min += 1; 
  
    # If minimum obtained 
    # is less than M 
    if (min != m): 
  
        # Update answer 
        answer = -1; 
  
    # Return answer 
    return answer; 
  
# Driver Code 
if __name__ == "__main__": 
  
    arr = [ 1, 2, 4 ]; 
    N = len(arr); 
    M = 3; 
      
    print(findLengthOfMaxSubset(arr, N, M)); 
  
# This code is contributed by AnkitRai01


C#
// C# program to implement 
// the above approach 
using System; 
using System.Collections.Generic;
  
class GFG{
      
// Function to find and return the 
// length of the longest subset 
// whose smallest missing value is M 
static int findLengthOfMaxSubset(int []arr, 
                                 int n, int m) 
{ 
      
    // Initialize a set 
    HashSet s = new HashSet(); 
  
    int answer = 0; 
  
    for(int i = 0; i < n; i++)
    { 
        int tmp = arr[i]; 
  
        // If array element is not 
        // equal to M 
        if (tmp != m)
        { 
              
            // Insert into set 
            s.Add(tmp); 
  
            // Increment frequency 
            answer++; 
        } 
    } 
      
    // Stores minimum missing 
    // number 
    int min = 1; 
  
    // Iterate to find the 
    // minimum missing 
    // integer 
    while (s.Contains(min))
    { 
        min++; 
    } 
  
    // If minimum obtained 
    // is less than M 
    if (min != m) 
    { 
          
        // Update answer 
        answer = -1; 
    } 
  
    // Return answer 
    return answer; 
}
  
// Driver code
public static void Main (string[] args)
{
    int []arr = { 1, 2, 4 }; 
    int N = arr.Length; 
    int M = 3; 
      
    Console.Write(findLengthOfMaxSubset(arr, N, M)); 
}
}
  
// This code is contributed by rutvik_56


输出:
3

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