0
点赞
收藏
分享

微信扫一扫

BM47 寻找第 K 大

仲秋花似锦 2022-04-06 阅读 37

在这里插入图片描述

解题思路:对元素组从大到小排序,然后找到对应K-1下标的值返回。归并排序时间复杂度O(nlog(N)),空间复杂度O(N)

import java.util.*;

public class Solution {
    public int findKth(int[] a, int n, int K) {
        // write code here
        //因为保证答案存在,故不用判断是否符合条件

        //1、对元素组排序
        sort(a, 0, n - 1);
        return a[K - 1];

    }

    private void sort(int[] a, int left, int right) {
        if (left >= right) {
            return;
        }
        int mid = (left + right) >> 1;
        sort(a, left, mid);
        sort(a, mid + 1, right);
        merge(a, left, mid, right);
    }

    private void merge(int[] a, int left, int mid, int right) {
        int[] result = new int[right - left + 1];
        int i = left, j = mid + 1, k = 0;
        while (i <= mid && j <= right) {
            result[k++] = a[i] < a[j] ? a[j++] : a[i++];
        }
        while (i <= mid) {
            result[k++] = a[i++];
        }
        while (j <= right) {
            result[k++] = a[j++];
        }
        for (int index = 0; index < result.length; index++) {
            a[left++] = result[index];
        }
    }
}

解法二:用系统自带的排序

import java.util.*;

public class Solution {
    public int findKth(int[] a, int n, int K) {
        // write code here
        Arrays.sort(a);
        return a[n-K];
    }
}

解法三:大根堆

import java.util.*;

public class Solution {
    public int findKth(int[] a, int n, int K) {
        // write code here
        PriorityQueue<Integer> maxQueue = new PriorityQueue<>((o1, o2)->o2 - o1);

        for (int i = 0; i < n; i++) {
            maxQueue.offer(a[i]);
        }
        int result = 0;
        for (int i = 0; i < K; i++) {
            result = maxQueue.poll();
        }
        return result;
    }
}

解法四:小根堆

import java.util.*;

public class Solution {
    public int findKth(int[] a, int n, int K) {
        // write code here
        PriorityQueue<Integer> maxQueue = new PriorityQueue<>((o1, o2)->o1 - o2);

        for (int i = 0; i < n; i++) {
            maxQueue.offer(a[i]);
        }
        int result = 0;
        for (int i = 0; i <= n - K; i++) {
            result = maxQueue.poll();
        }
        return result;
    }
}
举报

相关推荐

0 条评论