使用kotlin解决这个题目:215. 数组中的第K个最大元素 中等 2.2K 相关企业 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入: [3,2,1,5,6,4], k = 2 输出: 5 示例 2: 输入: [3,2,3,1,2,4,5,5,6], k = 4 输出: 4 提示: 1 <= k <= nums.length <= 105 -104 <= nums[i] <= 104
时间: 2024-02-02 08:04:49 浏览: 90
Kotlin中双冒号::使用方法
可以使用快速选择算法来解决该问题,其中快速选择算法是基于快速排序的,它可以在O(n)的时间复杂度内找到第k个最大元素。
具体实现步骤如下:
1. 定义一个函数 `quickSelect(nums: IntArray, k: Int, left: Int, right: Int): Int`,其中 `nums` 是给定的整数数组,`k` 是要查找的第k个最大元素,`left` 和 `right` 分别是数组的左右边界。
2. 在 `quickSelect` 函数中,使用快速排序的思想,选择一个基准元素 `pivot`,并将数组中小于等于 `pivot` 的元素移到左边,大于 `pivot` 的元素移到右边。
3. 判断 `k` 和 `pivot` 在数组中的位置关系,如果 `k` 小于等于 `pivot` 的下标,说明第k个最大元素在数组的左半部分,递归调用 `quickSelect(nums, k, left, pivot - 1)`。
4. 如果 `k` 大于 `pivot` 的下标,说明第k个最大元素在数组的右半部分,递归调用 `quickSelect(nums, k, pivot + 1, right)`。
5. 如果 `k` 等于 `pivot` 的下标,说明第k个最大元素就是 `pivot`,直接返回 `pivot`。
6. 循环以上步骤,直到找到第k个最大元素。
完整的代码如下:
```kotlin
fun findKthLargest(nums: IntArray, k: Int): Int {
return quickSelect(nums, k, 0, nums.size - 1)
}
fun quickSelect(nums: IntArray, k: Int, left: Int, right: Int): Int {
val pivot = partition(nums, left, right)
return when {
k < nums.size - pivot -> quickSelect(nums, k, pivot + 1, right)
k > nums.size - pivot -> quickSelect(nums, k - (nums.size - pivot), left, pivot - 1)
else -> nums[pivot]
}
}
fun partition(nums: IntArray, left: Int, right: Int): Int {
var i = left
var j = right
val pivot = nums[left]
while (i < j) {
while (i < j && nums[j] <= pivot) j--
nums[i] = nums[j]
while (i < j && nums[i] >= pivot) i++
nums[j] = nums[i]
}
nums[i] = pivot
return i
}
```
其中 `partition` 函数是快速排序中的分区函数,用于将数组中小于等于基准元素的元素移到左边,大于基准元素的元素移到右边,最终返回基准元素的下标。在 `quickSelect` 函数中,我们根据 `k` 和 `pivot` 的位置关系,判断第k个最大元素在数组的左半部分、右半部分还是就是 `pivot`,并递归调用 `quickSelect` 函数,直到找到第k个最大元素。
阅读全文