📜  查找LCM最多为K的阵列的最长子序列

📅  最后修改于: 2021-04-24 21:00:48             🧑  作者: Mango

给定一个由N个元素组成的数组arr []和一个正整数K。任务是在LCM(最小公倍数)最多为K的阵列中找到最长的子序列。按照获得的子序列元素的索引(从0开始),打印LCM和子序列的长度。如果无法打印,请打印-1

例子:

方法:找到阵列的所有唯一元素及其各自的频率。现在,您应该获得的最高LCM是K。假设你有一个数x满足1≤X≤K,获得所有从他X是一个多阵列唯一编号及其频率增加XnumCount。答案将是numCount最高的数字,让它成为您的LCM。现在,要获取子序列号的索引,请从头开始遍历数组,如果LCM%arr [i] = 0 ,则打印索引i

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
  
// Function to find the longest subsequence
// having LCM less than or equal to K
void findSubsequence(int* arr, int n, int k)
{
  
    // Map to store unique elements
    // and their frequencies
    map M;
  
    // Update the frequencies
    for (int i = 0; i < n; ++i)
        ++M[arr[i]];
  
    // Array to store the count of numbers whom
    // 1 <= X <= K is a multiple of
    int* numCount = new int[k + 1];
  
    for (int i = 0; i <= k; ++i)
        numCount[i] = 0;
  
    // Check every unique element
    for (auto p : M) {
        if (p.first <= k) {
  
            // Find all its multiples <= K
            for (int i = 1;; ++i) {
                if (p.first * i > k)
                    break;
  
                // Store its frequency
                numCount[p.first * i] += p.second;
            }
        }
        else
            break;
    }
  
    int lcm = 0, length = 0;
  
    // Obtain the number having maximum count
    for (int i = 1; i <= k; ++i) {
        if (numCount[i] > length) {
            length = numCount[i];
            lcm = i;
        }
    }
  
    // Condition to check if answer
    // doesn't exist
    if (lcm == 0)
        cout << -1 << endl;
    else {
  
        // Print the answer
        cout << "LCM = " << lcm
             << ", Length = " << length << endl;
  
        cout << "Indexes = ";
        for (int i = 0; i < n; ++i)
            if (lcm % arr[i] == 0)
                cout << i << " ";
    }
}
  
// Driver code
int main()
{
  
    int k = 14;
    int arr[] = { 2, 3, 4, 5 };
    int n = sizeof(arr) / sizeof(arr[0]);
  
    findSubsequence(arr, n, k);
  
    return 0;
}


Java
// Java implementation of the approach
import java.util.*;
  
class GFG
{
    // Function to find the longest subsequence
    // having LCM less than or equal to K
    static void findSubsequence(int []arr, int n, int k)
    {
      
        // Map to store unique elements
        // and their frequencies
        HashMap M = new HashMap();
      
        // Update the frequencies
        for (int i = 0; i < n; ++i)
        {
            if(M.containsKey(arr[i]))
                M.put(arr[i], M.get(arr[i])+1);
            else
                M.put(arr[i], 1);
        }
          
        // Array to store the count of numbers whom
        // 1 <= X <= K is a multiple of
        int [] numCount = new int[k + 1];
      
        for (int i = 0; i <= k; ++i)
            numCount[i] = 0;
      
        Iterator> itr = M.entrySet().iterator(); 
          
        // Check every unique element
        while(itr.hasNext()) 
        {
            HashMap.Entry entry = itr.next();
            if (entry.getKey() <= k) 
            {
      
                // Find all its multiples <= K
                for (int i = 1;; ++i) 
                {
                    if (entry.getKey() * i > k)
                        break;
      
                    // Store its frequency
                    numCount[entry.getKey() * i] += entry.getValue();
                }
            }
            else
                break;
        }
      
        int lcm = 0, length = 0;
      
        // Obtain the number having maximum count
        for (int i = 1; i <= k; ++i) 
        {
            if (numCount[i] > length) 
            {
                length = numCount[i];
                lcm = i;
            }
        }
      
        // Condition to check if answer
        // doesn't exist
        if (lcm == 0)
            System.out.println(-1);
        else
        {
      
            // Print the answer
            System.out.println("LCM = " + lcm
                + " Length = " + length );
      
            System.out.print( "Indexes = ");
            for (int i = 0; i < n; ++i)
                if (lcm % arr[i] == 0)
                    System.out.print(i + " ");
        }
    }
      
    // Driver code
    public static void main (String[] args) 
    {
      
        int k = 14;
        int arr[] = { 2, 3, 4, 5 };
        int n = arr.length;
      
        findSubsequence(arr, n, k);
    }
}
  
// This code is contributed by ihritik


Python3
# Python3 implementation of the approach
from collections import defaultdict
  
# Function to find the longest subsequence
# having LCM less than or equal to K
def findSubsequence(arr, n, k):
  
    # Map to store unique elements
    # and their frequencies
    M = defaultdict(lambda:0)
  
    # Update the frequencies
    for i in range(0, n):
        M[arr[i]] += 1
  
    # Array to store the count of numbers
    # whom 1 <= X <= K is a multiple of
    numCount = [0] * (k + 1)
  
    # Check every unique element
    for p in M: 
        if p <= k: 
  
            # Find all its multiples <= K
            i = 1
            while p * i <= k: 
                  
                # Store its frequency
                numCount[p * i] += M[p]
                i += 1
          
        else:
            break
      
    lcm, length = 0, 0
  
    # Obtain the number having maximum count
    for i in range(1, k + 1): 
        if numCount[i] > length: 
            length = numCount[i]
            lcm = i
  
    # Condition to check if answer doesn't exist
    if lcm == 0:
        print(-1)
    else:
  
        # Print the answer
        print("LCM = {0}, Length = {1}".format(lcm, length))
  
        print("Indexes = ", end = "")
        for i in range(0, n):
            if lcm % arr[i] == 0:
                print(i, end = " ")
      
# Driver code
if __name__ == "__main__":
  
    k = 14
    arr = [2, 3, 4, 5] 
    n = len(arr)
  
    findSubsequence(arr, n, k)
  
# This code is contributed by Rituraj Jain


C#
// C# implementation of the approach
using System;
using System.Collections.Generic;
  
class GFG
{
    // Function to find the longest subsequence
    // having LCM less than or equal to K
    static void findSubsequence(int []arr, int n, int k)
    {
      
        // Map to store unique elements
        // and their frequencies
        Dictionary M = new Dictionary();
      
        // Update the frequencies
        for (int i = 0; i < n; ++i)
        {
            if(M.ContainsKey(arr[i]))
                M[arr[i]]++;
            else
                M[arr[i]] = 1;
        }
          
        // Array to store the count of numbers whom
        // 1 <= X <= K is a multiple of
        int [] numCount = new int[k + 1];
      
        for (int i = 0; i <= k; ++i)
            numCount[i] = 0;
      
        Dictionary.KeyCollection keyColl = M.Keys;
          
        // Check every unique element
        foreach(int key in keyColl)
        {
            if ( key <= k) 
            {
      
                // Find all its multiples <= K
                for (int i = 1;; ++i) 
                {
                    if (key * i > k)
                        break;
      
                    // Store its frequency
                    numCount[key * i] += M[key];
                }
            }
            else
                break;
        }
      
        int lcm = 0, length = 0;
      
        // Obtain the number having maximum count
        for (int i = 1; i <= k; ++i)
        {
            if (numCount[i] > length) 
            {
                length = numCount[i];
                lcm = i;
            }
        }
      
        // Condition to check if answer
        // doesn't exist
        if (lcm == 0)
            Console.WriteLine(-1);
        else 
        {
      
            // Print the answer
            Console.WriteLine("LCM = " + lcm
                + " Length = " + length );
      
            Console.Write( "Indexes = ");
            for (int i = 0; i < n; ++i)
                if (lcm % arr[i] == 0)
                    Console.Write(i + " ");
        }
    }
      
    // Driver code
    public static void Main () 
    {
      
        int k = 14;
        int []arr = { 2, 3, 4, 5 };
        int n = arr.Length;
      
        findSubsequence(arr, n, k);
    }
}
  
// This code is contributed by ihritik


PHP
 $value)
    {
        if ($key <= $k)
        { 
  
            // Find all its multiples <= K 
            for ($i = 1;; ++$i) 
            { 
                if ($key * $i > $k) 
                    break; 
  
                // Store its frequency 
                $numCount[$key * $i] += $value; 
            } 
        } 
        else
            break; 
    } 
  
    $lcm = 0; $length = 0; 
  
    // Obtain the number having
    // maximum count 
    for ($i = 1; $i <= $k; ++$i) 
    { 
        if ($numCount[$i] > $length)
        { 
            $length = $numCount[$i]; 
            $lcm = $i; 
        } 
    } 
  
    // Condition to check if answer 
    // doesn't exist 
    if ($lcm == 0) 
        echo -1 << "\n"; 
    else 
    { 
  
        // Print the answer 
        echo "LCM = ", $lcm, 
             ", Length = ", $length, "\n"; 
  
        echo "Indexes = "; 
        for ($i = 0; $i < $n; ++$i) 
            if ($lcm % $arr[$i] == 0) 
                echo $i, " "; 
    } 
} 
  
// Driver code 
$k = 14; 
$arr = array( 2, 3, 4, 5 ); 
$n = count($arr);
  
findSubsequence($arr, $n, $k); 
  
// This code is contributed by Ryuga
?>


输出:
LCM = 12, Length = 3
Indexes = 0 1 2