首页 > 试题广场 >

找到无序数组中最小的k个数

[编程题]找到无序数组中最小的k个数
  • 热度指数:2420 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个整型数组arr,找到其中最小的k个数。

输入描述:
输入包含两行,第一行包含两个整数n和k,代表数组arr的长度,第二行包含n个整数,代表数组arr


输出描述:
输出包含一行,k个整数,代表数组中最小的k个整数。
示例1

输入

5 3
3 5 1 5 2

输出

3 1 2

备注:
时间复杂度,额外空间复杂度
package main

import (
    "container/heap"
    "fmt"
)

type IntHeap []int 

func(h IntHeap) Len() int {return len(h)}
func(h IntHeap) Less(i, j int) bool {return h[i]>h[j]}
func(h IntHeap) Swap(i,j int) {h[i],h[j] = h[j],h[i]}

func(h *IntHeap) Push(x interface{}) {
    *h = append(*h,x.(int))
}
func(h *IntHeap) Pop() interface{} {
    old := *h 
    n := len(old)
    x := old[n-1]
    *h = old[0:n-1]
    return x
}

func(h IntHeap) Peek() interface{} {
    x := h[0]
    return x
}

func main() {
    var (
        n int 
        k int 
        num int
    )
    fmt.Scan(&n,&k)
    arr := make([]int,n)
    for i:=0;i<n;i++ {
        fmt.Scan(&num)
        arr[i] = num
    }
    result := getMinKNumsByHeap(arr,k)
    for i:=0;i<len(result);i++ {
        fmt.Printf("%d ",result[i])
    }
}

func getMinKNumsByHeap(array []int, k int) []int{
    if len(array) == 0 || k < 0 || k > len(array) {
        return []int{} 
    }
    maxHeap := &IntHeap{}
    heap.Init(maxHeap)
    for i:=0;i<k;i++ {
        heap.Push(maxHeap,array[i])
    }
    for i:=k;i<len(array);i++ {
        if array[i] < maxHeap.Peek().(int) {
            heap.Pop(maxHeap)
            heap.Push(maxHeap,array[i])
        }
    }
    return *maxHeap
}

发表于 2021-11-13 11:13:24 回复(1)