[剑指 Offer 40]最小的k个数
创始人
2024-02-12 07:14:33
0

[剑指 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]

题解

利用快速排序划分数组

  • 首先判断 k 和 数组长度的关系,k >= arr.length 直接返回
  • 然后整个数组进行快速排序
  • 以数字第一个元素作为基准
  • 进行循环交换,循环条件为i < j
    • 从数组后边开始,找到第一个小于基准数的元素
    • 从第一个元素开始,找到第一个大于基准数的元素
    • 交换这两个元素,然后将基准数交换到正确位置
  • 判断 i 和 k 的关系
    • 如果相等,直接返回 i 前边的所有元素,即为最小的k个数
    • 否则,根据 i 的大小,继续划分对应部分,使 i==k
class Solution {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就返回,否则继续划分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;}
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...