📌  相关文章
📜  未排序数组中的Kth个最小或最大元素|套装4

📅  最后修改于: 2021-05-19 18:19:29             🧑  作者: Mango

给定一个数组arr []和一个数字K ,其中K小于数组的大小,我们需要找到给定数组中第K个最小的元素。给出了可以重复的数组元素(不限于不同的元素)。

例子:

我们还用其他方法讨论了本文:

  • 未排序数组中第K个最小/最大元素|套装1
  • 未排序数组中第K个最小/最大元素|设置2(预期线性时间)
  • 未排序数组中第K个最小/最大元素|组合3(最坏情况的线性时间)

方法:想法是使用计数排序的概念。步骤如下:

  1. 在数组中找到最大元素(例如maxE ),并创建一个长度为maxE + 1的数组(例如freq [] )并将其初始化为零。
  2. 循环遍历给定数组中的所有元素,并将元素的频率存储在freq []中
  3. 遍历数组freq []直到到达第K个元素。
  4. 打印在上述步骤中达到的第K个元素。

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
 
// Function to find the Kth smallest
// element in Unsorted Array
int findKthSmallest(int arr[], int n, int k)
{
 
    // Initialize the max Element as 0
    int max = 0;
 
    // Iterate arr[] and find the maximum
    // element in it
    for (int i = 0; i < n; i++)
    {
        if (arr[i] > max)
            max = arr[i];
    }
 
    // Frequenncy array to store
    // the frequencies
    int counter[max + 1] = { 0 };
 
    // Counter variable
    int smallest = 0;
 
    // Counting the frequencies
    for (int i = 0; i < n; i++)
    {
        counter[arr[i]]++;
    }
 
    // Iterate through the freq[]
    for (int num = 1; num <= max; num++)
    {
        // Check if num is present
        // in the array
        if (counter[num] > 0) {
 
            // Increment the counter
            // with the frequency
            // of num
            smallest += counter[num];
        }
 
        // Checking if we have reached
        // the Kth smallest element
        if (smallest >= k)
        {
            // Return the Kth
            // smallest element
            return num;
        }
    }
}
 
// Driver Code
int main()
{
    // Given array
    int arr[] = { 7, 1, 4, 4, 20, 15, 8 };
 
    int N = sizeof(arr) / sizeof(arr[0]);
 
    int K = 5;
 
    // Function Call
    cout << findKthSmallest(arr, N, K);
 
    return 0;
}


Java
// Java program for the above approach
import java.io.*;
 
class GFG {
 
    // Function to find the Kth smallest
    // element in Unsorted Array
    static int findKthSmallest(int[] arr, int n, int k)
    {
 
        // Initialize the max Element as 0
        int max = 0;
 
        // Iterate arr[] and find the maximum
        // element in it
        for (int i = 0; i < n; i++)
        {
            if (arr[i] > max)
                max = arr[i];
        }
 
        // Frequenncy array to store
        // the frequencies
        int[] counter = new int[max + 1];
 
        // Counter variable
        int smallest = 0;
 
        // Counting the frequencies
        for (int i = 0; i < n; i++)
        {
            counter[arr[i]]++;
        }
 
        // Iterate through the freq[]
        for (int num = 1; num <= max; num++)
        {
            // Check if num is present
            // in the array
            if (counter[num] > 0)
            {
                // Increment the counter
                // with the frequency
                // of num
                smallest += counter[num];
            }
 
            // Checking if we have reached
            // the Kth smallest element
            if (smallest >= k)
            {
                // Return the Kth
                // smallest element
                return num;
            }
        }
        return -1;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        // Given array
        int[] arr = { 7, 1, 4, 4, 20, 15, 8 };
 
        int N = arr.length;
 
        int K = 5;
 
        // Function call
        System.out.print(findKthSmallest(arr, N, K));
    }
}


Python3
# Python3 program for the
# above approach
 
# Function to find the Kth
# smallest element in Unsorted
# Array
def findKthSmallest(arr, n, k):
 
    # Initialize the max
    # Element as 0
    max = 0
 
    # Iterate arr[] and find
    # the maximum element in it
    for i in range(n):
        if (arr[i] > max):
            max = arr[i]
 
    # Frequenncy array to
    # store the frequencies
    counter = [0] * (max + 1)
 
    # Counter variable
    smallest = 0
 
    # Counting the frequencies
    for i in range(n):
        counter[arr[i]] += 1
 
    # Iterate through the freq[]
    for num in range(1, max + 1):
 
        # Check if num is present
        # in the array
        if (counter[num] > 0):
 
            # Increment the counter
            # with the frequency
            # of num
            smallest += counter[num]
 
        # Checking if we have reached
        # the Kth smallest element
        if (smallest >= k):
 
            # Return the Kth
            # smallest element
            return num
 
# Driver Code
if __name__ == "__main__":
 
    # Given array
    arr = [7, 1, 4, 4,
           20, 15, 8]
 
    N = len(arr)
    K = 5
 
    # Function Call
    print(findKthSmallest(arr, N, K))
 
# This code is contributed by Chitranayal


C#
// C# program for the
// above approach
using System;
using System.Collections.Generic;
class GFG{
 
// Function to find the Kth smallest
// element in Unsorted Array
static int findKthSmallest(int[] arr,
                           int n, int k)
{
  // Initialize the max
  // Element as 0
  int max = 0;
 
  // Iterate []arr and find
  // the maximum element in it
  for (int i = 0; i < n; i++)
  {
    if (arr[i] > max)
      max = arr[i];
  }
 
  // Frequenncy array to store
  // the frequencies
  int[] counter = new int[max + 1];
 
  // Counter variable
  int smallest = 0;
 
  // Counting the frequencies
  for (int i = 0; i < n; i++)
  {
    counter[arr[i]]++;
  }
 
  // Iterate through the []freq
  for (int num = 1;
           num <= max; num++)
  {
    // Check if num is present
    // in the array
    if (counter[num] > 0)
    {
      // Increment the counter
      // with the frequency
      // of num
      smallest += counter[num];
    }
 
    // Checking if we have reached
    // the Kth smallest element
    if (smallest >= k)
    {
      // Return the Kth
      // smallest element
      return num;
    }
  }
  return -1;
}
 
// Driver code
public static void Main(String[] args)
{
  // Given array
  int[] arr = {7, 1, 4, 4,
               20, 15, 8};
  int N = arr.Length;
  int K = 5;
 
  // Function call
  Console.Write(findKthSmallest(arr,
                                N, K));
}
}
 
// This code is contributed by shikhasingrajput


输出
8




时间复杂度: O(N) ,其中N是给定数组中元素的数量。
辅助空间: O(M)其中M是给定数组中的最大元素。