首页 > 试题广场 >

数组中最大的k个数

[编程题]数组中最大的k个数
  • 热度指数:120 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

求取一个数组最大K个数,返回k个数可以为任意排序,假设数组元素有N个,要求算法时间复杂度不大于O(N*log(K)),空间复杂度为O(1)。

示例1

输入

[3, 2, 1, 4, 5],2

输出

[5,4]

备注:
输出结果从大到小排列
import java.util.*;
public class Solution {
// 找前k个大的数-堆排序
    public int[] top_k (int[] arr, int k) {
        int end = arr.length-1;
        for (int i = end/2; i >= 0; i--) { // 先建堆
            adjust(arr, i, end);
        }
        for (int i = 0; i < k; i++) { // 先交换再调整k次
            swap(arr, 0, end);
            adjust(arr, 0, --end);
        }
        int[] res = new int[k];
        int idx = 0;
        for (int i = 0; i < k; i++) {
            res[idx++] = arr[arr.length-1-i];
        }
        return res;
    }
    // 调整函数
    public void adjust(int[] arr, int idx, int end) {
        int imax = idx;
        int l = idx * 2 + 1, r = l+1;
        if (l <= end && arr[l] > arr[imax]) imax = l;
        if (r <= end && arr[r] > arr[imax]) imax = r;
        if (imax == idx) return;
        else { // 可以交换继续换
            swap(arr, imax, idx);
            idx = imax;
            adjust(arr, idx, end);
        }
    }
    // 辅助交换
    public void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
}
发表于 2022-07-19 15:10:17 回复(0)