215. 数组中的第K个最大元素 + 快速排序 + 大根堆
215. 数组中的第K个最大元素
LeetCode-215
另一道类似的第k大元素问题:https://www.cnblogs.com/GarrettWale/p/14386862.html
题目详情

方法一:使用快速排序
package com.walegarrett.interview;
/**
 * @Author WaleGarrett
 * @Date 2021/2/17 22:24
 */
import java.util.Arrays;
/**
 * 题目描述:在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
 */
/**
 * 方法一:使用快速排序的思想
 */
public class LeetCode_215 {
    public int findKthLargest(int[] nums, int k) {
        return quickSort(nums, nums.length-k+1, 0, nums.length -1);
    }
    /**
     * 一趟排序,每一趟返回一个数的确定位置
     * @param arr
     * @param l
     * @param r
     * @return
     */
    int partition(int[] arr, int l, int r){
        int fix = arr[l];//需要确定arr[l]的位置
        while(l<r){
            while(arr[r] >= fix && l<r)
                r--;
            if(l<r){
                arr[l] = arr[r];
                l++;
            }
            while(arr[l] <= fix && l<r)
                l++;
            if(l<r){
                arr[r] = arr[l];
                r--;
            }
        }
        //最后才确定fix的位置
        arr[l] = fix;
        return l;
    }
    /**
     * 查找最小的k个数
     * @param arr
     * @param k
     * @param l
     * @param r
     */
    int quickSort(int[] arr, int k, int l, int r){
        int index = partition(arr, l, r);
        if(index == k-1){
            return arr[index];
        }else if(index <k-1){//找到的index个数小于k个,需要继续往右半部分递归查找
            return quickSort(arr, k, index+1, r);
        }else{
            return quickSort(arr, k, l, index-1);
        }
    }
}

方法二:使用大根堆排序
/**
 * 方法二:自定义大根堆
 */
class LeetCode_215_2 {
    public int findKthLargest(int[] nums, int k) {
        int heapSize = nums.length;
        createHeap(nums,heapSize);
        for(int i=nums.length-1;i>=nums.length-k-1;i--){
            swap(i,0,nums);
            heapAdjust(0,nums,--heapSize);
        }
        return nums[0];
    }
    /**
     * 构建大根堆:从非叶子结点开始从下往上构建大根堆
     * @param nums
     * @param heapSize
     */
    void createHeap(int[] nums,int heapSize){
        int len = heapSize;
        for(int i=len/2; i>=0; i--){
            heapAdjust(i, nums,heapSize);
        }
    }
    /**
     * 堆调整
     * @param root
     * @param nums
     * @param heapSize
     */
    void heapAdjust(int root,int[] nums,int heapSize){
        int lr = root*2+1, rr=root*2+2;
        int len = heapSize;
        int maxIndex = root;
        if(lr<len && nums[lr]>nums[maxIndex]){
            maxIndex = lr;
        }
        if(rr<len && nums[rr]>nums[maxIndex]){
            maxIndex = rr;
        }
        if(maxIndex!=root){
            swap(root,maxIndex,nums);
            heapAdjust(maxIndex,nums,heapSize);
        }
    }
    void swap(int i, int j, int[] nums){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

215. 数组中的第K个最大元素 + 快速排序 + 大根堆的更多相关文章
- Java实现 LeetCode 215. 数组中的第K个最大元素
		
215. 数组中的第K个最大元素 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6 ...
 - LeetCode 215——数组中的第 K 个最大元素
		
1. 题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...
 - Leetcode 215.数组中的第k个最大元素
		
数组中的第k个最大元素 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 ...
 - Leetcode题目215.数组中的第K个最大元素(中等)
		
题目描述: 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...
 - LeetCode题解 | 215. 数组中的第K个最大元素
		
在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...
 - Leetcode 215. 数组中的第K个最大元素 By Python
		
在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...
 - 215. 数组中的第K个最大元素
		
在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2输出: 5示 ...
 - LeetCode 215. 数组中的第K个最大元素(Kth Largest Element in an Array)
		
题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...
 - leetcode 215. 数组中的第K个最大元素(python)
		
在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2输出: 5示 ...
 
随机推荐
- 【noi 2.6_9283】&【poj 3088】Push Botton Lock(DP--排列组合 Stirling数)
			
题意:N个编号为1~N的数,选任意个数分入任意个盒子内(盒子互不相同)的不同排列组合数. 解法:综合排列组合 Stirling(斯特林)数的知识进行DP.C[i][j]表示组合,从i个数中选j个数的方 ...
 - Caocao's Bridges HDU - 4738  找桥
			
题意: 曹操在赤壁之战中被诸葛亮和周瑜打败.但他不会放弃.曹操的军队还是不擅长打水仗,所以他想出了另一个主意.他在长江上建造了许多岛屿,在这些岛屿的基础上,曹操的军队可以轻易地攻击周瑜的军队.曹操还修 ...
 - 洛谷 P1429 平面最近点对(加强版) (分治模板题)
			
题意:有\(n\)个点对,找到它们之间的最短距离. 题解:我们先对所有点对以\(x\)的大小进行排序,然后分治,每次左右二等分递归下去,当\(l+1=r\)的时候,我们计算一下距离直接返回给上一层,若 ...
 - Codeforces Round #670 (Div. 2)  A. Subset Mex  (贪心)
			
题意:给你一长度为\(n\)的序列,将其分为两个集合,求两个集合中未出现的最小元素的最大值, 题解:用桶存一下每个元素的个数,两次枚举\([1,100]\),找出两个最小值即可. 代码: int t; ...
 - 主席树  【权值线段树】 && 例题K-th Number POJ - 2104
			
一.主席树与权值线段树区别 主席树是由许多权值线段树构成,单独的权值线段树只能解决寻找整个区间第k大/小值问题(什么叫整个区间,比如你对区间[1,8]建立一颗对应权值线段树,那么你不能询问区间[2,5 ...
 - Cell 动态行高文字显示不全问题探索
			
目录 问题概述 一.新建工程 二.尝试复现问题 尝试解决 修改contentLblBtmCon优先级为High(750) 修改contentLblBtmCon优先级为Low(250) 小结 其他解决思 ...
 - C - dlopen dlsym
			
-----------------------------------------------------------------------------dlsym------------------ ...
 - leetcode15 三数之和 双指针
			
注意题目没要求数字只能用一次 a + b + c = 0 即为 -b=a+c,同时要求数字不全为正(然后发现a+b+c就行...不过多想想没坏处嘛) 先处理特殊情况,然后 先排序 注意不重复,只需要有 ...
 - acm的做题技巧
			
1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 大数据输入输出时最好不要用cin.cout,防止超时. (或加上 1 ios ...
 - php foundation knowledge!
			
php foundation knowledge! 1 <?php 2 $p = "PII"; 3 define("XPI",3.1415926); 4 ...