layout: posttitle: PHP 计算最小的k个数
subtitle: PHP 计算最小的k个数
date: 2020-05-19
author: he xiaodong
header-img: img/default-post-bg.jpg
catalog: true
tags:
- Go
- PHP
- LeetCode
- 计算最小的k个数

计算最小的k个数

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

示例 1:

  1. 输入:arr = [3,2,1], k = 2
  2. 输出:[1,2] 或者 [2,1]

示例 2:

  1. 输入:arr = [0,1,2,1], k = 1
  2. 输出:[0]

限制:

  • 0 <= k <= arr.length <= 10000
  • 0 <= arr[i] <= 10000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof

解题思路

直接使用最大堆,堆的大小为 k,这样保证空间占用最小,最小堆的根节点是就是最小值,也是我们想要的结果。PHP 的 SPL 标准库是有最大堆这个库,直接在代码中继承 SplMinHeap 。

PHP 实现

  1. class Solution {
  2. /**
  3. * @param Integer[] $arr
  4. * @param Integer $k
  5. * @return Integer[]
  6. */
  7. function getLeastNumbers($arr, $k) {
  8. $heap = new SplMaxHeap();
  9. foreach ($arr as $key => $val) {
  10. if ($heap->count() < $k) {
  11. $heap->insert($val);
  12. } elseif ($heap->valid() && $heap->top() > $val) {
  13. // 当堆满的时候,比较要插入元素和堆顶元素大小。小于堆顶的插入。堆顶移除。
  14. $heap->extract();
  15. $heap->insert($val);
  16. }
  17. }
  18. $minArray = [];
  19. for ($i = 0; $i < $k; $i++) {
  20. if ($heap->valid()) {
  21. $minArray[] = $heap->top();
  22. $heap->next();
  23. }
  24. }
  25. return $minArray;
  26. }
  27. }

© 原创文章

最后恰饭 阿里云全系列产品/短信包特惠购买 中小企业上云最佳选择 阿里云内部优惠券