当前位置:首页 > 编程笔记 > 正文
已解决

算法通关村第十关白银挑战——数组中的第K个最大元素

来自网友在路上 175875提问 提问时间:2023-10-20 10:47:52阅读次数: 75

最佳答案 问答题库758位专家为你答疑解惑

数组中的第K个最大元素

LeetCode 215:给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

时间复杂度要求是O(n)。

int quickSelect(vector<int>& nums, int left, int right, int k) {if (left == right) {return nums[k];}int pivot = nums[left], i = left - 1, j = right + 1;while (i < j) {do { i++; } while (nums[i] < pivot);do { j--; } while (nums[j] > pivot);if (i < j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}if (k <= j) return quickSelect(nums, left, j, k);else return quickSelect(nums, j + 1, right, k);
}
int findKthLargest(vector<int>& nums, int k) {return quickSelect(nums, 0, nums.size() - 1, nums.size() - k);
}
  1. quickSelect函数是快速选择算法的主要实现部分。这个函数接受一个整数数组nums,一个左边界left和一个右边界right,以及一个目标索引k。它使用递归来实现快速选择。

    • 如果left等于right,那么数组中只有一个元素,直接返回这个元素即可。
    • 否则,选择数组中间的元素作为枢轴(pivot)。然后,通过比较枢轴元素和数组中其他元素的大小关系,将数组分为两部分:小于枢轴的元素和大于枢轴的元素。
    • 根据目标索引k与当前枢轴位置的关系,递归调用quickSelect函数,分别在小于枢轴的部分和大于枢轴的部分进行选择。
    • 最终,递归调用会返回目标索引k对应的元素。
  2. findKthLargest函数是调用quickSelect函数的地方,它使用了一个技巧来减少递归深度。这个函数接受一个整数数组nums和一个目标索引k,它调用quickSelect函数时,将左边界设置为0,右边界设置为数组长度减1,目标索引设置为数组长度减k。这样,只需要对数组进行一次递归调用就可以找到第k大的元素。

查看全文

99%的人还看了

相似问题

猜你感兴趣

版权申明

本文"算法通关村第十关白银挑战——数组中的第K个最大元素":http://eshow365.cn/6-20236-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!