Swift刷算法

Swift刷算法:第K个最大元素

2022-06-18  本文已影响0人  JonorZhang

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

LeetCode:https://leetcode.cn/problems/kth-largest-element-in-an-array

class Solution {
    func findKthLargest(_ nums: [Int], _ k: Int) -> Int {
        // 为了能原地排序重定义成var
        var nums = nums

        func partition(_ lo: Int, _ hi: Int) -> Int {
            
            var i = lo, j = hi
            // 使用挖坑填数大法:以第一个元素为基准存入pivot,相当于在nums[i]处先挖个坑
            let pivot = nums[i]

            while i < j {
                // 从右到左找第一个比基准值大的位置
                while i < j, nums[j] <= pivot { j -= 1 }
                // 填入左边坑位,此时nums[j]处形成新的坑位
                nums[i] = nums[j]

                // 从左到右找第一个比基准值小的位置
                while i < j, nums[i] >= pivot { i += 1 }
                // 填入右边坑位,此时nums[i]处形成新的坑位
                nums[j] = nums[i]
            }
            // 最终i==j,把基准值放入最后这个坑位
            // 此时基准值左边元素都大于等于它本身
            nums[i] = pivot
            // 返回基准值位置
            return i
        }

        func fastFind(_ lo: Int, _ hi: Int) -> Int {
            if lo > hi { return -1 }
            // 寻找一个
            let i = partition(lo, hi)
            if i == k - 1 {
                // 第K大等于基准值位置,返回该元素值即可
                return nums[i]
            } else if i < k - 1 {
                // 第K大在基准值位置右侧
                return fastFind(i+1, hi)
            } else/* if i > k - 1 */ {
                // 第K大在基准值位置左侧
                return fastFind(lo, i-1)                
            }
        }

        return fastFind(0, nums.count - 1)
    }
}
image.png
上一篇 下一篇

猜你喜欢

热点阅读