牛客网--关于最小的k个数

牛客网--关于最小的k个数

  • 题目描述
  • 代码

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

代码

import java.util.*;
public class Solution {
    public ArrayList GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList ret = new ArrayList<>();
        int len = input.length;
        
        if(len < k)
        {
            return ret;
        }
            
        buildMaxHeap(input, k);
        for(int i = k; i < len; i++)
        {
            if(input[i] < input[0])
            {
                swap(input, 0, i);
            }
            maxHeapify(input, 0, k);
        }
        for(int j = 0; j < k; j++)
        {
            ret.add(input[j]);
        }
        return ret;
    }
    private void buildMaxHeap(int [] input, int k)
    {
        for(int i = k / 2; i >= 0; i--)
        {
            maxHeapify(input, i, k);
        }
    }
    private void maxHeapify(int [] input, int i, int k)
    {
        int largest = i;
        int left = 2 * i + 1;
        int right = 2 * i + 2;
        if(left < k && input[left] > input[largest])
        {
            largest = left;
        }
        if(right < k && input[right] > input[largest])
        {
            largest = right;
        }
        if(largest != i)
        {
            swap(input, i, largest);
            maxHeapify(input, largest, k);
        }
    }
    private void swap(int [] input, int i, int j)
    {
        int temp = input[i];
        input[i] = input[j];
        input[j] = temp;
    }
}

你可能感兴趣的:(OJ,Java刷题,牛客网)