题目地址(40. 最小的k个数)
https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/
题目描述
输入整数数组 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 <= 100000 <= arr[i] <= 10000
前置知识
公司
- 暂无
思路
关键点
代码
- 语言支持:Java
Java Code:
api大法 或者手写一下快排
class Solution {public int[] getLeastNumbers(int[] arr, int k) {Arrays.sort(arr);return Arrays.copyOf(arr, k);}}
class Solution {public int[] getLeastNumbers(int[] arr, int k) {kuai(arr, 0, arr.length - 1);return Arrays.copyOf(arr, k);}public void kuai(int[] ints, int left, int right) {//递归终止条件if (left >= right) {return;}int i = left;int j = right;//基准值 最左边的值int base = ints[left];while (i < j) {//这里的顺序不能反 必须是先-- 假设数组为 5 4 3 2 6 如果是++先 那么i就直接遍历到6才会停下 然后外层再和left交换 就不能正确的排序了while (i < j && ints[j] >= base) {j--;}while (i < j && ints[i] <= base) {i++;}//交换i 第一个大于base的值 和j 第一个小于base的值int tmp = ints[i];ints[i] = ints[j];ints[j] = tmp;}// 交换i和left 这样base的左边都是小于他的 右边都是大于他的int tmp = ints[i];ints[i] = ints[left];ints[left] = tmp;//递归调用左边和右边kuai(ints, left, i - 1);kuai(ints, i+1, right);}}
复杂度分析
令 n 为数组长度。
- 时间复杂度:
- 空间复杂度:
#card=math&code=O%28n%29&id=TWZmX)
