剑指 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. 【NOIP 2015 D1 T2】信息传递(图论--带权并查集/bfs)

    题目:有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学.游戏开始时,每人都只知道自己的生日.之后每一轮中, ...

  2. hdu3341Lost's revenge (AC自动机+变进制dp)

    Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submissio ...

  3. spfa+链式前向星模板

    #include<bits/stdc++.h> #define inf 1<<30 using namespace std; struct Edge{ int nex,to,w ...

  4. tensorflow加载ckpt出错

    Issue链接 问题: tensorflow加载ckpt出错 此处原因: 该ckpt文件对应的tensorflow版本过老, 其中的部分内置变量名发生了改变. 提示: Key lstm_o/bidir ...

  5. adjust All In One

    adjust All In One 调整 https://www.adjust.com/ Maximize the impact of your mobile marketing Adjust is ...

  6. Vue & Sentry

    Vue & Sentry config.errorHandler https://cn.vuejs.org/v2/api/#errorHandler Vue.config.errorHandl ...

  7. no need jQuery anymore & You don't need jQuery anymore!

    no need jQuery anymore & You don't need jQuery anymore! "use strict"; /** * * @author ...

  8. js 实现前端路由的方法

    js 实现前端路由的方法 前端路由原理 History API https://developer.mozilla.org/en-US/docs/Web/API/History_API https:/ ...

  9. svn conflict & svn cleanup

    svn conflict & svn cleanup OK $ svn --help $ svn cleanup Tree Conflicts https://tortoisesvn.net/ ...

  10. element ui 停止维护了

    ️‍♂️ element ui 停止维护了 最近看到有人说 element ui 已经停止维护了,还有点不相信; 不过到 github 验证一下,好像是真的呀 4 个月,没有任何更新了 https:/ ...