剑指 Offer 40. 最小的k个数

Offer_40

题目描述

解法一:排序后取前k个数

/**
* 题目描述:输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
*/
/**
* 方法一:先对数字进行排序,然后依次找到最小的k个数
*/
public class Offer_40 {
public int[] getLeastNumbers(int[] arr, int k) {
if(arr == null || arr.length == 0 || k==0)
return new int[0];
Arrays.sort(arr);
int[] result = new int[k];
int index = 1;
result[0] = arr[0];
for(int i = 1; i<arr.length; i++){
if(index >= k)
break;
if(arr[i] != arr[i-1]){
result[index++] = arr[i];
}
}
return result;
}
}

解法二:使用大根堆维护k个最小的数

/**

 * 方法二:使用大根堆维护k个最小的数
*/
class Offer_40_1 {
public int[] getLeastNumbers(int[] arr, int k) {
if(arr == null || arr.length == 0 || k==0)
return new int[0];
int[] result = new int[k];
//java的优先队列默认是小根堆实现,而c++中默认是大根堆实现。
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(new Comparator<Integer>() {
//自定义排序器,降序排序
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
for(int i = 0;i<k; i++){
priorityQueue.offer(arr[i]);
}
for(int i=k; i<arr.length; i++){
if(priorityQueue.peek() > arr[i]){
priorityQueue.poll();
priorityQueue.offer(arr[i]);
}
}
for(int i=0;i<k;i++){
result[i] = priorityQueue.poll();
}
return result;
}
}

解法三:使用快速排序的思想找前k个最小的数

/**
* 方法三:使用快排的思想
*/
class Offer_40_2 {
/**
* 一趟排序,每一趟返回一个数的确定位置
* @param arr
* @param l
* @param r
* @return
*/
int partition(int[] arr, int l, int r){
int fix = arr[l];//需要确定arr[l]的位置
while(l<r){
while(arr[r] >= fix && l<r)
r--;
if(l<r){
arr[l] = arr[r];
l++;
}
while(arr[l] <= fix && l<r)
l++;
if(l<r){
arr[r] = arr[l];
r--;
}
}
//最后才确定fix的位置
arr[l] = fix;
return l;
} /**
* 查找最小的k个数
* @param arr
* @param k
* @param l
* @param r
*/
int[] quickSort(int[] arr, int k, int l, int r){
int index = partition(arr, l, r);
if(index == k-1){
int[] result = new int[k];
result = Arrays.copyOf(arr, k);
return result;
}else if(index <k-1){//找到的index个数小于k个,需要继续往右半部分递归查找
return quickSort(arr, k, index+1, r);
}else{
return quickSort(arr, k, l, index-1);
}
} public int[] getLeastNumbers(int[] arr, int k) {
if(arr == null || arr.length == 0 || k==0)
return new int[0];
return quickSort(arr, k, 0, arr.length -1);
}
}

剑指 Offer 40. 最小的k个数 + 优先队列 + 堆 + 快速排序的更多相关文章

  1. 剑指 Offer 40. 最小的k个数

    剑指 Offer 40. 最小的k个数 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:ar ...

  2. 【Java】 剑指offer(40) 最小的k个数

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7 ...

  3. 每日一题 - 剑指 Offer 40. 最小的k个数

    题目信息 时间: 2019-06-30 题目链接:Leetcode tag: 快排 难易程度:中等 题目描述: 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3. ...

  4. 【剑指Offer】最小的K个数 解题报告(Python)

    [剑指Offer]最小的K个数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...

  5. Go语言实现:【剑指offer】最小的K个数

    该题目来源于牛客网<剑指offer>专题. 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. Go语言实现: fu ...

  6. 剑指OFFER之最小的K个数(九度OJ1371)

    题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 输入: 每个测试案例包括2行: 第一行为2个整数n,k(1< ...

  7. 《剑指offer》最小的k个数

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  8. 剑指Offer 29. 最小的K个数 (其他)

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 题目地址 https://www.nowcoder.com/prac ...

  9. 【剑指offer】最小的K个数

    一.题目: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 二.思路: 一群大牛在讨论用噼里啪啦各种排序,复杂度一般也都是O ...

随机推荐

  1. Codeforces Round #649 (Div. 2) A. XXXXX

    题目链接:https://codeforces.com/contest/1364/problem/A 题意 找出大小为 $n$ 的数组 $a$ 的最长连续子数组,其元素和不被 $x$ 整除. 题解 如 ...

  2. 【noi 2.6_9270】&【poj 2440】DNA(DP)

    题意:问长度为L的所有01串中,有多少个不包含"101"和"111"的串. 解法:f[i][j]表示长度为i的01串中,结尾2位的十进制数是j的合法串的个数.那 ...

  3. Detect the Virus ZOJ - 3430 AC自动机

    One day, Nobita found that his computer is extremely slow. After several hours' work, he finally fou ...

  4. Pdf和Office相关归集

    Spire 支持Pdf.Office等的诸多操作,使用方便,需收费,免费版本仅支持10页以内的操作,在 这里 可以下载库. 优点 测试过打印效果佳,操作简便. 缺点 PDF打印慢,免费版本仅支持10页 ...

  5. ssh原理及加密传输

    1.ssh??(保证过程中是加密的,即安全的)ssh 是 Secure Shell 的缩写,是一个建立在应用层上的安全远程管理协议.ssh 是目前较为可靠的传输协议,专为远程登录会话和其他网络服务提供 ...

  6. Nginx基础 - 配置缓存web服务

    1.缓存配置语法 1)proxy_cache配置语法 Syntax: proxy_cache zone | off; Default: proxy_cache off; Context: http, ...

  7. codeforces 1030D Vasya and Triangle【思维+gcd】

    题目:戳这里 题意:选出三个点构成三角形,要求面积为n*m/k. 解题思路:因为三个点的坐标都是正整数,根据三角形面积公式(x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2))/2=n* ...

  8. Linux POSIX共享内存方法&ipcs &struct shmid_ds

    内容是主进程创建子进程计算斐波那契数列. 其中计算到第几项是有主进程命令行输入. 共享内存段,并且查看了一些信息. 参考操作系统概念第七版 3.10,3.11 关于LINUX C库函数 中的 fpri ...

  9. linux 必备 学习 资源 汇总 大全!

    Linux https://www.linux.com/ https://youtu.be/CE4WeUNFX2g https://www.youtube.com/watch?v=JzsLkbwi1L ...

  10. JavaScript for, for...in, for...of, for-await...of difference All In One

    JavaScript for, for...in, for...of, for-await...of difference All In One for for...in for...of for-a ...