K-й самый большой элемент массива в Scala: изучение нескольких методов

Нахождение K-го по величине элемента массива — распространенная проблема в программировании и алгоритмических собеседованиях. В этой статье мы рассмотрим различные методы решения этой проблемы с использованием языка программирования Scala. Мы обсудим различные подходы, сравним их временную сложность и предоставим примеры кода для каждого метода.

Метод 1: сортировка массива
Один простой подход — отсортировать массив в порядке убывания и вернуть K-й элемент. Вот фрагмент кода Scala для этого метода:

def findKthLargest(nums: Array[Int], k: Int): Int = {
  val sortedArray = nums.sortWith(_ > _)
  sortedArray(k - 1)
}

Метод 2: использование приоритетной очереди
Другой эффективный подход предполагает использование приоритетной очереди или максимальной кучи. Мы можем создать максимальную кучу размером K и перебирать массив, добавляя элементы в кучу. Если размер кучи превышает K, мы удаляем максимальный элемент. Наконец, корнем кучи будет K-й по величине элемент. Ниже представлена ​​реализация Scala:

import scala.collection.mutable.PriorityQueue
def findKthLargest(nums: Array[Int], k: Int): Int = {
  val maxHeap = PriorityQueue.empty[Int].reverse
  nums.foreach(num => {
    maxHeap.enqueue(num)
    if (maxHeap.size > k)
      maxHeap.dequeue()
  })
  maxHeap.dequeue()
}

Метод 3: Алгоритм быстрого выбора
Алгоритм быстрого выбора — это эффективный способ найти K-й элемент в несортированном массиве. Он похож на алгоритм быстрой сортировки, но фокусируется на разделении только необходимых частей массива. Вот реализация Scala:

import scala.util.Random
def findKthLargest(nums: Array[Int], k: Int): Int = {
  def swap(arr: Array[Int], i: Int, j: Int): Unit = {
    val temp = arr(i)
    arr(i) = arr(j)
    arr(j) = temp
  }
  def partition(arr: Array[Int], left: Int, right: Int): Int = {
    val pivotIndex = Random.between(left, right + 1)
    val pivotValue = arr(pivotIndex)
    swap(arr, pivotIndex, right)
    var i = left
    for (j <- left until right) {
      if (arr(j) <= pivotValue) {
        swap(arr, i, j)
        i += 1
      }
    }
    swap(arr, i, right)
    i
  }
  def quickselect(arr: Array[Int], left: Int, right: Int, k: Int): Int = {
    if (left == right) return arr(left)
    val pivotIndex = partition(arr, left, right)
    if (k == pivotIndex) arr(k)
    else if (k < pivotIndex) quickselect(arr, left, pivotIndex - 1, k)
    else quickselect(arr, pivotIndex + 1, right, k)
  }
  quickselect(nums, 0, nums.length - 1, nums.length - k)
}

В этой статье мы рассмотрели три различных метода поиска K-го по величине элемента массива с помощью Scala. Мы обсудили сортировку массива с использованием очереди приоритетов и алгоритма быстрого выбора. Каждый метод имеет свои преимущества и недостатки с точки зрения временных затрат и сложности реализации. Понимая эти методы, вы сможете выбрать наиболее подходящий подход для ваших конкретных требований.