leetcode 面试题 17.14. 最小K个数 大顶堆 小顶堆 快排
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个数 大顶堆 小顶堆 快排相关推荐
- 【每日一题】 面试题 17.14. 最小K个数
面试题 17.14. 最小K个数
- 面试题 17.14. 最小K个数
面试题 17.14. 最小K个数 设计一个算法,找出数组中最小的k个数.以任意顺序返回这k个数均可. 示例: 输入: arr = [1,3,5,7,2,4,6,8], k = 4 输出: [1,2,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 ...
- 力扣 面试题 17.14. 最小K个数
题目 设计一个算法,找出数组中最小的k个数.以任意顺序返回这k个数均可. 示例 输入: arr = [1,3,5,7,2,4,6,8], k = 4 输出: [1,2,3,4] 来源:力扣(LeetC ...
- 小k java_leetcode——面试题 17.14. 最小K个数 (java快速排序)
描述:设计一个算法,找出数组中最小的k个数.以任意顺序返回这k个数均可. 输入: arr = [1,3,5,7,2,4,6,8], k = 4 输出: [1,2,3,4] 解题思路: 这题因为不要求排 ...
- ⭐算法入门⭐《堆》中等01 —— LeetCode 面试题 17.09. 第 k 个数
文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述 有些数的素因子只有 3 ...
- 算法试题 - 找出最小 k 个数
题目 题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解析 思路1 这一题应用堆排序算法复杂度只有O(nlog k), ...
- 程序员面试金典 - 面试题 17.09. 第 k 个数(set优先队列/DP)
1. 题目 有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数. 注意,不是必须有这些素因子,而是必须不包含其他的素因子. 例如,前几个数按顺序应该是 1,3,5,7,9,15,21. 示 ...
- 力扣 面试题 17.09. 第 k 个数
题目 有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数.注意,不是必须有这些素因子,而是必须不包含其他的素因子.例如,前几个数按顺序应该是 1,3,5,7,9,15,21. 示例 输入: ...
最新文章
- iOS动画编程-Layer动画[ 2 ] Getting Started with Layer Animations
- 网格布局每个网格都能放置一个组件_Android综合试题
- Zongsoft.Data 发布公告
- 实数范围内(包含负数)的求模与求余运算异同
- Springboot+Dubbo+Nacos 注解方式实现微服务调用
- winform模拟登陆网页_Python爬虫使用selenium爬取群成员信息(全自动实现自动登陆)...
- 防火墙虚拟系统互访配置实例
- 3.5 Zend_Db_Table_Rowset
- Laravel框架和TP框架区别
- 基于HTML5+CSS制作 H5移动端电商购物网页设计35页面(包括主页,商品详情,转账,付款,购物车等页面) 功能齐全...
- html怎么简单做圆形进度条,css3如何实现圆形进度条?css3中圆形进度条的实现
- 百度首页代码(HTML+CSS+jQuery)
- mapreduce推测执行算法及原理
- 西门子em235模块的功能_多图细讲,模拟量模块与变送器的接线
- (KWS-LSTM)Max-pooling loss training of long short-term memory networks for small-footprint keyword s
- JavaScript点击图片加上红色边框
- IntelliJ IDEA设置自动导包方法
- DarkHole_2
- 线性代数 李永乐强化班
- HRBUST - 1646
热门文章
- 好用的磁盘管理工具:DiskCatalogMaker for Mac
- 神经网络实现逻辑运算,神经网络 最小二乘法
- 微信公众号使用:微信公众平台企业号一次发布多条图文消息的方法
- 修改Mathon为默认浏览器
- 牛客小白月赛8 F-数列操作 (有序表)
- matlab平摆线曲率参数方程,参数方程中曲线欣赏—平摆线解读.ppt
- Netty游戏服务器实战开发(6):Netty整合Zookeeper实现分布式服务发现与注册
- BUUCTF Crypto 4
- 链表---给定一个排序链表,删除所有重复的元素每个元素只留下一个
- 前端ffmpeg实现视频剪切