剑指 Offer 40. 最小的k个数

输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。

示例 1:

输入:arr = [3,2,1], k = 2

输出:[1,2] 或者 [2,1]

示例 2:

输入:arr = [0,1,2,1], k = 1

输出:[0]

限制:

0 <= k <= arr.length <= 10000

0 <= arr[i] <= 10000

做题思路:其实做这道题,还是有点套模板的嫌疑,尤其是可以直接套快排的模板,先看答案之前,可以先学习一下左神的快排代码。

public class Code_04_QuickSort {
public static void quickSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
quickSort(arr, 0, arr.length - 1);
} public static void quickSort(int[] arr, int l, int r) {
if (l < r) {
//swap(arr, l + (int) (Math.random() * (r - l + 1)), r);
int[] p = partition(arr, l, r);
quickSort(arr, l, p[0] - 1);
quickSort(arr, p[1] + 1, r);
}
} //设置了less,more作为左右两个边界,然后让l来与more相互比较,然后再进行交换数据,并移动l或者more的位置
public static int[] partition(int[] arr, int l, int r) {
int less = l - 1;
int more = r;
while (l < more) {
if (arr[l] < arr[r]) {
swap(arr, ++less, l++);
} else if (arr[l] > arr[r]) {
swap(arr, --more, l);
} else {
l++;
}
}
swap(arr, more, r);
return new int[] { less + 1, more };
} //交换数组的数据
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}

一、哨兵操作

class Solution1 {
/*
这是执行的哨兵的操作,设置一个基数,大于这个基数移动到右边,小于这个相反即可
*/
public int[] getLeastNumbers(int[] arr, int k) {
quickSort(arr, 0, arr.length - 1);
return Arrays.copyOf(arr, k);
} private void quickSort(int[] arr, int l, int r) {
//当数组长度为1时终止
if (l >= r) return;
int i = l, j = r;
//这里是把arr[l]当做基数,然后和arr[i]和arr[j]做对比,和快排或者荷兰国旗问题有点像,大于或者小于就--或者++
while (i < j) {
while (i < j && arr[j] >= arr[l]) j--;
while (i < j && arr[i] <= arr[l]) i++;
swap(arr, i, j);
}
swap(arr, i, l);
//这是递归左(右)执行左右两边的划分
quickSort(arr, l, i - 1);
quickSort(arr, i + 1, r); } private void swap(int[] arr, int i, int j){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}

二、快排

class Solution2 {
/*
这是一个快排的操作思路
*/
public int[] getLeastNumbers(int[] arr, int k) {
if (k >= arr.length) return arr;
return quickSort(arr, k, 0, arr.length - 1);
} private int[] quickSort(int[] arr, int k, int l, int r) {
int i = l, j = r;
while (i < j) {
while (i < j && arr[j] >= arr[l]) j--;
while (i < j && arr[i] <= arr[l]) i++;
swap(arr, i, j);
}
swap(arr, i, l);
/*
这里
i > k 则递归 左边的快排(左边的数组)
i < k 则递归 右边的快排(右边的数组)
*/
if (i > k) return quickSort(arr, k, l, i - 1);
if (i < k) return quickSort(arr, k, i + 1, r);
return Arrays.copyOf(arr, k);
} private void swap(int[] arr, int i, int j){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}

最新文章

  1. Entity Framework 手动使用migration里面的up 和down方法。
  2. CocoaPods 的简单快速安装方法
  3. 1-Recyclerview使用系列之Recyclerview的列表数据显示
  4. dll显式加载与隐式加载
  5. urllib3 ProxyManager
  6. yum的一些用法
  7. mysql导入数据大小设置方法
  8. oendir(),readdir(),closedir() 打开/读取/关闭目录
  9. python命令行参数处理
  10. python基础操作
  11. C#爬虫使用代理刷csdn文章浏览量
  12. Spring boot 继承 阿里 autoconfig 配置环境参数
  13. [Swift]LeetCode82. 删除排序链表中的重复元素 II | Remove Duplicates from Sorted List II
  14. mysql----------mysql的一些常用命令
  15. nagios监控mysql及邮件报警
  16. [转载]Black-Scholes 模型中 d1,d2 是怎么得到的?如何理解 Black-Scholes 模型?
  17. 手把手教你用MATLAB画灰度直方图
  18. poj 2553 缩点+染色+出度
  19. 20155308《网络对抗》Exp4 恶意代码分析
  20. Ubutnu linux 下升级python版本,以2.x升级到3.x为例

热门文章

  1. 技术实践:教你用Python搭建gRPC服务
  2. hdu5438 拓扑排序+DFS
  3. 地图可视化神器keplergl新增对jupyter lab 3.0的支持
  4. 线上BUG:MySQL死锁分析实战
  5. 乘风破浪,Windows11设计和开发指导,全新图标字体和云母材质
  6. 关于Excel中表格转Markdown格式的技巧
  7. 8、SpringBoot整合之SpringBoot整合MongoDB
  8. promise的基本使用
  9. kafka 安装和配置
  10. Linux下使用Ansible处理批量操作