Leetcode 215、数组中第k个最大的元素

题目链接kth-largest-element-in-an-array

方法1:

使用快速排序。

1、对数组进行partition,从left到right随机选择一个主元pivot,将pivot与left的元素交换位置。

另索引 j 初始为left,扫描从left + 1到right的元素,若小于pivot,则将其与 ++j 处的元素交换。

这样当扫描结束,left的元素即主元pivot,从left + 1到 j 的元素都大于pivot,从 j + 1到right的元素都小于等于pivot。

将left位置的元素与 j 位置的互换,则从left到 j-1 的元素都大于pivot,j 位置元素等于pivot,j 右边元素都小于等于pivot。

因此partition完成。返回pivot的位置 j。

2、若pivot的下标 idx 等于 k - 1,则pivot位置的元素即第K大的元素。

若idx大于 k - 1,另right = idx - 1,返回第一步在左边寻找。

若idx小于 k - 1,另left = idx + 1,返回第一步在右边寻找。

code:

 1 class Solution:
 2
 3     def findKthLargest(self, nums: List[int], k: int) -> int:
 4         def partition(nums, left, right):
 5             pivot_idx = random.randint(left, right)
 6             if nums[pivot_idx] != nums[left]:
 7                 nums[left], nums[pivot_idx] = nums[pivot_idx], nums[left]
 8             pivot = nums[left]
 9
10             j = left
11             for i in range(left + 1, right + 1):
12                 if nums[i] > pivot:
13                     j += 1
14                     nums[j], nums[i] = nums[i], nums[j]
15             # nums[left] = pivot,nums[left+1...j] > pivot,交换后nums[left..j-1] > pivot,nums[j] = pivot,nums[j+1...right] <= pivot
16             if nums[j] != nums[left]:
17                 nums[j], nums[left] = nums[left], nums[j]
18             return j
19
20         left = 0
21         right = len(nums) - 1
22         while True:
23             idx = partition(nums, left, right)
24             if idx == k - 1:
25                 return nums[idx]
26             elif idx > k - 1:
27                 right = idx - 1
28             else:
29                 left = idx + 1

方法2:

用优先队列实现。

1、可以用小顶堆,维护K个最大的元素。

先将数组前K个元素入堆,遍历数组的元素,当某元素大于堆顶元素,则堆顶出堆,将此元素加入。

最终堆顶元素即第K大的元素。

2、可用大顶堆,维护N - K + 1个最小的元素,这是因为第K大即第N - K + 1 小。

先将数组前N - K + 1个元素入堆,遍历数组的元素,当某元素小于堆顶元素,则堆顶出堆,将此元素加入。

最终堆顶元素即第K大的元素。

3、时间复杂度为O(NlogK),空间复杂度为O(K),因此当K < N / 2,用小顶堆,否则大顶堆。

code:

 1 class Solution {
 2 public:
 3     int findKlarge(vector<int>& nums, int k) {
 4         priority_queue<int, vector<int>, greater<int>> pq; //小顶堆
 5         for (int i = 0; i < k; i++) {
 6             pq.push(nums[i]);
 7         }
 8         for (int i = k; i < nums.size(); i++) {
 9             if (nums[i] > pq.top()) {
10                 pq.pop();
11                 pq.push(nums[i]);
12             }
13         }
14         return pq.top();
15     }
16
17     int findKsmall(vector<int>& nums, int k) {
18         priority_queue<int> pq; //默认大顶堆
19         for (int i = 0; i < k; i++) {
20             pq.push(nums[i]);
21         }
22         for (int i = k; i < nums.size(); i++) {
23             if (nums[i] < pq.top()) {
24                 pq.pop();
25                 pq.push(nums[i]);
26             }
27         }
28         return pq.top();
29     }
30     int findKthLargest(vector<int>& nums, int k) {
31         if (k < nums.size() / 2) {
32             return findKlarge(nums, k);
33         }
34         return findKsmall(nums, nums.size() - k + 1);
35     }
36 };

原文地址:https://www.cnblogs.com/lxc1910/p/12681716.html

时间: 2024-08-30 03:42:37

Leetcode 215、数组中第k个最大的元素的相关文章

[LeetCode]215. 数组中的第K个最大元素(堆)

题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例?2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kth-largest-ele

leetcode 215. 数组中的第K个最大元素(快速排序)

在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度. 来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/kth-largest-element-in-

LeetCode 215. 数组中的第K个最大元素(Kth Largest Element in an Array)

题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度. 解题思路 利用快速排序的思想,在进行排序过程中每次可以确定一个元素的最终位置,若此位置为第K个最大元素,则直接返回此索引,否则继续

Leetcode 215. 数组中的第K个最大元素 By Python

在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 思路 一个sorted再直接返回第K个最大元素就好了 代码 class Solution(object): def findKthLargest(self, nums, k): """ :t

leetcode 215. 数组中的第K个最大元素(python)

在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度. class Solution: def findKthLargest(self, nums: List[int], k: int) -> int:

LeetCode:数组中的第K个最大元素【215】

LeetCode:数组中的第K个最大元素[215] 题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度. 题目分析 我们主要来学习一个新的集合类型--优先队列.优先队列作用是保证每次取

[LeetCode] Kth Largest Element in an Array 数组中第k大的数字

Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element. For example, Given [3,2,1,5,6,4] and k = 2, return 5. Note: You may assume k is always valid, 1 ≤ k ≤ array'

leetcode | Median of Two Sorted Arrays 寻找2个有序数组中第k大的值

问题 Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log(m + n)). 分析 本题更经典通用的描述方式时: 给定2个有序数组,找出2个数组中所有元素中第k大的元素. 思路1 直观思

九度OJ 1534 数组中第K小的数字

题目1534:数组中第K小的数字 时间限制:2 秒 内存限制:128 兆 特殊判题:否 提交:1524 解决:307 题目描述: 给定两个整型数组A和B.我们将A和B中的元素两两相加可以得到数组C. 譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,6]. 现在给你数组A和B,求由A和B两两相加得到的数组C中,第K小的数字. 输入: 输入可能包含多个测试案例. 对于每个测试案例,输入的第一行为三个整数m,n, k(1<=m,n<=100000, 1&l