leetcode 面试题 17.14. 最小K个数
[难度:中等]

设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。

示例:
输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]
提示:0 <= len(arr) <= 100000
0 <= k <= min(100000, len(arr))

分析:可以使用小顶堆、大顶堆以及快速排序的思路来完成该题

使用小顶堆时就是对整个数组遍历构造堆,需要较多的空间,且建堆的复杂度为O(nlog(n))O(nlog(n))O(nlog(n))。

import java.util.Comparator;
import java.util.PriorityQueue;class Solution {public int[] smallestK(int[] arr, int k) {if (k==0)return new int[]{};PriorityQueue<Integer> minHeap = new PriorityQueue<>((a,b)->a-b);for (int val:arr) {minHeap.add(val);}int[] ans = new int[k];for (int i = 0; i < k; i++)ans[i] = minHeap.poll();return ans;}
}

这时可以采用大顶堆的方式,只对k个大元素进行建模,其中堆顶为最大元素,每次遇到小于堆顶元素的值后替换堆顶元素,通过一轮遍历保证大顶堆中的元素为数组的最小k个值。这时建堆复杂度为 O(nlogk)O(nlogk)O(nlogk).

import java.util.Comparator;
import java.util.PriorityQueue;class Solution {public int[] smallestK(int[] arr, int k) {if (k==0)return new int[]{};//只放k个元素的大根堆PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a,b)->b-a);for (int val:arr) {if(maxHeap.size() < k){maxHeap.add(val);}else if(val <maxHeap.peek()){maxHeap.poll();maxHeap.add(val);}}int[] ans = new int[k];for (int i = 0; i < k; i++)ans[i] = maxHeap.poll();return ans;}
}

最后还有快排的思路,在快排的一次Partition过程中会选定一个中间值,并通过交换两边值的位置导致小于该元素的都在左边,大于的都在右边,这个时候可以通过中间值的位置判断大于(小于)该元素的数值有多少个,并与k进行比较,从而确定最小的k个是在哪一边,并对该边重复执行Partition的过程。 由于每次都会随机选择基准值,每次递归的数组平均长度为 n/2,划分数组操作的次数不会超过 2∗n。整体复杂度为 O(n)

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Random;class Solution {int _k;public int[] smallestK(int[] arr, int k) {_k = k;int[] ans = new int[k];if(k==0)return ans;qsort(arr,0,arr.length-1);for (int i = 0; i < k; i++)ans[i] = arr[i];return ans;}public void qsort(int[] arr,int l, int r){if(l>=r)return;int i=l,j=r;int midIdx = new Random().nextInt(r-l+1)+l;swap(arr,l,midIdx);int pivot = arr[l];while (i<j){while (i<j&&arr[j]>=pivot)j--;while (i<j&&arr[i]<=pivot)i++;swap(arr,i,j);}swap(arr,l,i);if(i>_k)qsort(arr,l,i-1);if(i<_k)qsort(arr,i+1,r);}void swap(int[] arr,int l,int r){int tmp = arr[r];arr[r] = arr[l];arr[l] = tmp; }
}

leetcode 面试题 17.14. 最小K个数 大顶堆 小顶堆 快排相关推荐

  1. 【每日一题】 面试题 17.14. 最小K个数

    面试题 17.14. 最小K个数

  2. 面试题 17.14. 最小K个数

    面试题 17.14. 最小K个数 设计一个算法,找出数组中最小的k个数.以任意顺序返回这k个数均可. 示例: 输入: arr = [1,3,5,7,2,4,6,8], k = 4 输出: [1,2,3 ...

  3. 程序员面试金典 - 面试题 17.14. 最小K个数(快排划分O(n))

    1. 题目 设计一个算法,找出数组中最小的k个数.以任意顺序返回这k个数均可. 示例: 输入: arr = [1,3,5,7,2,4,6,8], k = 4 输出: [1,2,3,4]提示: 0 &l ...

  4. 力扣 面试题 17.14. 最小K个数

    题目 设计一个算法,找出数组中最小的k个数.以任意顺序返回这k个数均可. 示例 输入: arr = [1,3,5,7,2,4,6,8], k = 4 输出: [1,2,3,4] 来源:力扣(LeetC ...

  5. 小k java_leetcode——面试题 17.14. 最小K个数 (java快速排序)

    描述:设计一个算法,找出数组中最小的k个数.以任意顺序返回这k个数均可. 输入: arr = [1,3,5,7,2,4,6,8], k = 4 输出: [1,2,3,4] 解题思路: 这题因为不要求排 ...

  6. ⭐算法入门⭐《堆》中等01 —— LeetCode 面试题 17.09. 第 k 个数

    文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述   有些数的素因子只有 3 ...

  7. 算法试题 - 找出最小 k 个数

    题目 题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解析 思路1 这一题应用堆排序算法复杂度只有O(nlog k), ...

  8. 程序员面试金典 - 面试题 17.09. 第 k 个数(set优先队列/DP)

    1. 题目 有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数. 注意,不是必须有这些素因子,而是必须不包含其他的素因子. 例如,前几个数按顺序应该是 1,3,5,7,9,15,21. 示 ...

  9. 力扣 面试题 17.09. 第 k 个数

    题目 有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数.注意,不是必须有这些素因子,而是必须不包含其他的素因子.例如,前几个数按顺序应该是 1,3,5,7,9,15,21. 示例 输入: ...

最新文章

  1. iOS动画编程-Layer动画[ 2 ] Getting Started with Layer Animations
  2. 网格布局每个网格都能放置一个组件_Android综合试题
  3. Zongsoft.Data 发布公告
  4. 实数范围内(包含负数)的求模与求余运算异同
  5. Springboot+Dubbo+Nacos 注解方式实现微服务调用
  6. winform模拟登陆网页_Python爬虫使用selenium爬取群成员信息(全自动实现自动登陆)...
  7. 防火墙虚拟系统互访配置实例
  8. 3.5 Zend_Db_Table_Rowset
  9. Laravel框架和TP框架区别
  10. 基于HTML5+CSS制作 H5移动端电商购物网页设计35页面(包括主页,商品详情,转账,付款,购物车等页面) 功能齐全...
  11. html怎么简单做圆形进度条,css3如何实现圆形进度条?css3中圆形进度条的实现
  12. 百度首页代码(HTML+CSS+jQuery)
  13. mapreduce推测执行算法及原理
  14. 西门子em235模块的功能_多图细讲,模拟量模块与变送器的接线
  15. (KWS-LSTM)Max-pooling loss training of long short-term memory networks for small-footprint keyword s
  16. JavaScript点击图片加上红色边框
  17. IntelliJ IDEA设置自动导包方法
  18. DarkHole_2
  19. 线性代数 李永乐强化班
  20. HRBUST - 1646

热门文章

  1. 好用的磁盘管理工具:DiskCatalogMaker for Mac
  2. 神经网络实现逻辑运算,神经网络 最小二乘法
  3. 微信公众号使用:微信公众平台企业号一次发布多条图文消息的方法
  4. 修改Mathon为默认浏览器
  5. 牛客小白月赛8 F-数列操作 (有序表)
  6. matlab平摆线曲率参数方程,参数方程中曲线欣赏—平摆线解读.ppt
  7. Netty游戏服务器实战开发(6):Netty整合Zookeeper实现分布式服务发现与注册
  8. BUUCTF Crypto 4
  9. 链表---给定一个排序链表,删除所有重复的元素每个元素只留下一个
  10. 前端ffmpeg实现视频剪切