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

题解

方法二:借助 partition 操作定位到最终排定以后索引为 len - k 的那个元素

以下的描述基于 “快速排序” 算法知识的学习,如果忘记的朋友们可以翻一翻自己的《数据结构与算法》教材,复习一下,partition 过程、分治思想和 “快速排序” 算法的优化。

分析:我们在学习 “快速排序” 的时候,接触的第 1 个操作就是 partition(切分),简单介绍如下:

partition(切分)操作,使得:

对于某个索引 jnums[j] 已经排定,即 nums[j] 经过 partition(切分)操作以后会放置在它 “最终应该放置的地方”;
nums[left]nums[j - 1] 中的所有元素都不大于 nums[j]
nums[j + 1]nums[right]中的所有元素都不小于 nums[j]

215. 数组中的第K个最大元素_第1张图片

partition(切分)操作总能排定一个元素,还能够知道这个元素它最终所在的位置,这样每经过一次 partition(切分)操作就能缩小搜索的范围,这样的思想叫做 “减而治之”(是 “分而治之” 思想的特例)。

java代码如下:

//找数组中第K大的数字

public class 找数组中第K大的数字 {

    public static int findKthLargest(int[] nums, int k){

        int left = 0;
        int right = nums.length -1;
        int pivot = nums[0];
        int target = nums.length - k;

        while(true){
            int index = 找数组中第K大的数字.partition(nums, left, right);

            if (index < target){
                left = index + 1;
            }else if(index > target){
                right = index - 1;
            }else{
                return nums[index];
            }
        }
    }

    public static int partition(int[] nums,int left,int right){
        if(left > right){
            return -1;
        }

        int temp = nums[left];
        int i = left;
        int j = right;

        while(i != j){
            while(nums[j] >= temp && j > i){
                j --;
            }

            while(nums[i] <= temp && j > i){
                i ++;
            }

            if(i < j){
                int t = nums[i];
                nums[i] = nums[j];
                nums[j] = t;
            }
        }

        nums[left] = nums[i];
        nums[i] = temp;

        return i;
    }


    public static void main(String[] args) {
        int[] arr = {1,8,6,3,7};

        int kthLargest = 找数组中第K大的数字.findKthLargest(arr, 2);
        System.out.println(kthLargest);
    }
}

你可能感兴趣的:(算法,数据结构,算法,java,快速排序,排序算法)