215.数组中的第K个最大元素
思路1:
使用冒泡排序排序好后并根据索引返回即可
代码实现
class Solution {
public int findKthLargest(int[] nums, int k) {
int tmp = 0;
for (int i = 0; i < nums.length - 1; i++) {
for (int j = 0; j < nums.length - i - 1; j++) {
if (nums[j] < nums[j + 1]) {
tmp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = tmp;
}
}
}
return nums[k - 1];
}
}
思路2:
直接调用Arrays的sort方法排序并根据索引返回
代码实现
class Solution {
public int findKthLargest(int[] nums, int k) {
Arrays.sort(nums);
return nums[nums.length - k];
}
}
思路3:
使用优先队列完成
代码实现
class Solution {
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> queue = new PriorityQueue<>();
for (int i = 0; i < nums.length; i++) {
queue.offer(nums[i]);
if (queue.size() > k) queue.poll();
}
return queue.peek();
}
}
思路4:
使用堆排序
代码实现
class Solution {
public int findKthLargest(int[] nums, int k) {
heapSort(nums);
return nums[nums.length - k];
}
private static void heapSort(int[] nums) {
//创建堆
for (int i = (nums.length - 1) / 2; i >= 0; i--) {
//从第一个非叶子结点从下至上,从右至左调整结构
adjustHeap(nums, i, nums.length);
}
//调整堆结构+交换堆顶元素与末尾元素
for (int i = nums.length - 1; i > 0; i--) {
//将堆顶元素与末尾元素进行交换
int temp = nums[i];
nums[i] = nums[0];
nums[0] = temp;
//重新对堆进行调整
adjustHeap(nums, 0, i);
}
}
/**
* 调整堆
* @param nums 待排序列
* @param parent 父节点
* @param length 待排序列尾元素索引
*/
private static void adjustHeap(int[] nums, int parent, int length) {
//将temp作为父节点
int temp = nums[parent];
//左孩子
int lChild = 2 * parent + 1;
while (lChild < length) {
//右孩子
int rChild = lChild + 1;
// 如果有右孩子结点,并且右孩子结点的值大于左孩子结点,则选取右孩子结点
if (rChild < length && nums[lChild] < nums[rChild]) {
lChild++;
}
// 如果父结点的值已经大于孩子结点的值,则直接结束
if (temp >= nums[lChild]) {
break;
}
// 把孩子结点的值赋给父结点
nums[parent] = nums[lChild];
//选取孩子结点的左孩子结点,继续向下筛选
parent = lChild;
lChild = 2 * lChild + 1;
}
nums[parent] = temp;
}
}