剑指 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 #575 (Div. 3) E. Connected Component on a Chessboard

    传送门 题意: 给你一个黑白相间的1e9*1e9的棋盘,你需要从里面找出来由b个黑色的格子和w个白色的格子组成的连通器(就是你找出来的b+w个格子要连接在一起,不需要成环).问你可不可以找出来,如果可 ...

  2. 梨子带你刷burp练兵场(burp Academy) - 服务端篇 - Sql注入配套漏洞讲解笔记

    目录 Sql注入 什么是Sql注入呢? Sql注入有哪些例子? 检索隐藏数据 打破应用逻辑 利用Union进行跨库查询 如何确定利用Union的注入攻击所需的列数呢? 如何确定Union的查询结果中哪 ...

  3. Python——Django框架——Model数据库模型

    一.设置 1.Django的setting中配置数据库(MySQL配置) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql' ...

  4. Leetcode(337)-打家劫舍III

    小偷又发现一个新的可行窃的地点. 这个地区只有一个入口,称为"根". 除了根部之外,每栋房子有且只有一个父房子. 一番侦察之后,聪明的小偷意识到"这个地方的所有房屋形成了 ...

  5. 什么是 DNS 的 A记录 和 CNAME记录 域名解析 为我的自定义域名创建 CNAME 记录

    # CNAME https://support.google.com/blogger/answer/58317?hl=zh-Hans 为我的自定义域名创建 CNAME 记录 如果您的域名不是在 Blo ...

  6. Xcode show whitespace

    Xcode show whitespace Xcode 11.5 how to config Xcode show whitespace 如何配置 Xcode 显示空白字符 Editor -> ...

  7. 使用 js 实现一个简易版的动画库

    使用 js 实现一个简易版的动画库 具有挑战性的前端面试题 animation css refs https://www.infoq.cn/article/0NUjpxGrqRX6Ss01BLLE x ...

  8. 如何实现 React 模块动态导入

    如何实现 React 模块动态导入 React 模块动态导入 代码分割 webpack & code splitting https://reactjs.org/docs/code-split ...

  9. taro best practice

    taro best practice 最佳实践 https://taro-docs.jd.com/taro/docs/best-practice.html#关于-jsx-支持程度补充说明 https: ...

  10. c++ 使用进程id获取打开的网络端口

    #pragma warning( disable : 4996) #include <winsock2.h> #include <ws2tcpip.h> #include &l ...