LeetCode OJ 215. Kth Largest Element in an Array 堆排序求解

题目链接:https://leetcode.com/problems/kth-largest-element-in-an-array/

215. Kth Largest Element in an Array

My Submissions

Question

Total Accepted: 43442 Total
Submissions: 136063 Difficulty: Medium

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‘s length.

Credits:

Special thanks to @mithmatt for adding this problem and creating all test cases.

Subscribe to see which companies asked this question

Show Tags

Show Similar Problems

Have you met this question in a real interview?

Yes

No

Discuss

求给定数组的第K大的元素。如果先排序,然后取第K个元素,那么时间复杂度是O(n*log n)。借助堆的数据结构,可以把时间复杂度降到O(n*logk)。

如果求第K大的元素,那么要构建的是小顶堆。求第K小的元素,那么要构建大顶堆!先构建k个元素的堆,另外i-k个元素逐个跟堆顶元素比较,如果比堆顶元素小,那么就将该元素纳入堆中,并保持堆的性质。

我的AC代码

public class KthLargestElementinanArray {

	public static void main(String[] args) {
		int[] a = { 3, 2, 1, 5, 6, 4 };
		System.out.println(findKthLargest(a, 1));
		int[] b = { -1,2,0};
		System.out.println(findKthLargest(b, 3));
		int[] c = { 3,1,2,4};
		System.out.println(findKthLargest(c, 2));

	}

	public static int findKthLargest(int[] nums, int k) {
		int[] heap = new int[k];

		heap[0] = nums[0];
		for (int i = 1; i < k; i++) {
			siftUp(nums[i], heap, i);
		}

		for (int i = k; i < nums.length; i++) {
			siftDown(nums, k, heap, i);
		}

		return heap[0];
	}

	private static void siftDown(int[] nums, int k, int[] heap, int i) {
		if (nums[i] > heap[0]) {
			heap[0] = nums[i];
			int p = 0;
			while(p < k) {
				int minChild = 2 * p + 1;
				if(minChild + 1 < k && heap[minChild] > heap[minChild + 1]) minChild ++;
				if(minChild < k && heap[p] > heap[minChild]) {
					swap(heap, p, minChild);
					p = minChild;
				} else break;
			}
		}
	}

	private static void siftUp(int num, int[] heap, int i) {
		int p = i;
		heap[i] = num;
		while (p != 0) {
			int parent = (p - 1) / 2;
			if (heap[parent] > heap[p]) {
				swap(heap, p, parent);
			}
			p = parent;
		}
	}

	private static void swap(int[] heap, int p, int parent) {
		int temp = heap[parent];
		heap[parent] = heap[p];
		heap[p] = temp;
	}
}
时间: 2024-12-06 12:55:10

LeetCode OJ 215. Kth Largest Element in an Array 堆排序求解的相关文章

LeetCode OJ 215. Kth Largest Element in an Array

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's

【LeetCode】215. Kth Largest Element in an Array (2 solutions)

Kth Largest Element in an Array 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

【LeetCode】215. Kth Largest Element in an Array

题目: 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 ≤ arr

网易2016 实习研发工程师 [编程题]寻找第K大 and leetcode 215. Kth Largest Element in an Array

传送门 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2,2],5,3 返回:2 note: 注意手写快排的时候: while(i < j) { while(j > i && a[j] > a[left]) j--; while(i < j && a[i] <= a[left]) i++; if(i

刷题215. Kth Largest Element in an Array

一.题目说明 题目215. Kth Largest Element in an Array,在一个无序数组中找第k大的元素.难度是Medium! 二.我的解答 这个题目最直观的解答是,先对数组排序,然后直接返回: class Solution{ public: int findKthLargest(vector<int>& nums,int k){ sort(nums.begin(),nums.end()); return nums[nums.size()-k]; } }; 性能如下:

LeetCode 215 : Kth Largest Element in an Array

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's

Java for LeetCode 215 Kth Largest Element in an Array【Coming Soon】

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. 解题思路: 本题是<算法导论>原题,

leetcode 215. Kth Largest Element in an Array 寻找第k个大的数---------- java

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's

215. Kth Largest Element in an Array

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's le