返回

用 Swift 算法学院找到数组中第 k 大值

IOS

引言

在数据科学和计算机科学中,查找数组中第 k 大值的算法非常有用。此任务的应用包括快速选择和排序算法。在本文中,我们将使用来自 Swift 算法学院的 Swift 实现,一步步地解决这个问题。

算法概述

Swift 算法学院的算法采用分治策略,将数组划分为较小的部分,并递归地查找每个部分的第 k 大值。具体步骤如下:

  1. 选择基准点: 从数组中随机选择一个元素作为基准点。
  2. 分区: 将数组划分为两部分:比基准点小的元素和比基准点大的元素。
  3. 递归: 如果 k 等于分区后较小部分的长度,则基准点就是第 k 大值。否则,在较小部分或较大部分继续递归地查找第 k 大值。

Swift 实现

func findKthLargest(_ nums: [Int], _ k: Int) -> Int {
    guard nums.count >= k, k > 0 else {
        fatalError("Invalid input")
    }
    
    return quickSelect(nums, 0, nums.count - 1, k - 1)
}

func quickSelect(_ nums: [Int], _ start: Int, _ end: Int, _ k: Int) -> Int {
    guard start <= end else {
        fatalError("Invalid range")
    }
    
    let pivot = partition(nums, start, end)
    
    if k == pivot {
        return nums[pivot]
    } else if k < pivot {
        return quickSelect(nums, start, pivot - 1, k)
    } else {
        return quickSelect(nums, pivot + 1, end, k)
    }
}

func partition(_ nums: [Int], _ start: Int, _ end: Int) -> Int {
    let pivot = nums[end]
    var partitionIndex = start
    
    for i in start..<end {
        if nums[i] < pivot {
            nums.swapAt(i, partitionIndex)
            partitionIndex += 1
        }
    }
    
    nums.swapAt(partitionIndex, end)
    return partitionIndex
}

示例用法

let nums = [3, 2, 1, 5, 6, 4]
let k = 2
let result = findKthLargest(nums, k)
print("The \(k)th largest element is: \(result)") // 输出:5

SEO 优化