15. 数组中的第K个最大元素

15. 数组中的第K个最大元素

复制代码
package 数组;

import jdk.nashorn.internal.ir.CallNode;

import java.util.Random;

public class 数组中的第k大元数 {
    public static void main(String[] args) {
        int[] nums = {1};
        int k = 1;
        数组中的第k大元数 o = new 数组中的第k大元数();
        System.out.println(o.findKthLargest(nums, k));
    }


    Random random = new Random();

    // 快排解法:每次partition都会确定一个数的位置
    // 随机取一个数作为基准,进行partition,看prartion的index的情况
    // 要是相同,就对了
    // 要是大于,就再从前半部分随机选一个数
    // 要是小于,就从后半部分随机选一个数
    public int findKthLargest(int[] nums, int k) {
        int m = nums.length - k;
        return quickSelect(nums, 0, nums.length - 1, m);
    }

    public int quickSelect(int[] nums, int start, int end, int k) {
        int index = partition(nums, start, end);
        if (index == k) {
            return nums[index];
        }
        if (index > k) {
            return quickSelect(nums, 0, index - 1, k);
        } else {
            return quickSelect(nums, index + 1, end, k);
        }
    }

    // 7,3,2,9,23,8
    public int partition(int[] nums, int start, int end) {
        if(start==end){
            return start;
        }
        int i = random.nextInt(end - start) + start;
        int k = nums[i];
        // 把数组头和k交换,这样才好对数组进行分区
        swap(nums, i, start);
        while (start < end) {
            while (nums[end] > k && start < end) {
                end--;
            }
            if (start < end) {
                nums[start] = nums[end];
                start++;
            }
            while (nums[start] < k && start < end) {
                start++;
            }
            if (start < end) {
                nums[end] = nums[start];
                end--;
            }
        }
        nums[start] = k;
        return start;
    }

    public void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }


}
复制代码

 

。。

posted @   guoyu1  阅读(46)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2019-12-02 ZAB协议-Zookeeper一致性协议
2019-12-02 Zookeeper数据类型、节点类型、角色、watcher监听机制
点击右上角即可分享
微信分享提示