题解 | #最小的K个数#

最小的K个数

http://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf

方法一:先排序,在找到前K个

以下用Java实现,用Java自带的数组排序方法进行升序排列,然后保存前K个。因为返回类型定义为ArrayList动态数组,因此需要将前k个依次装入结果数组;如果返回类型直接就是数组,我们可以调用Arrays.copyOf(arr, index)直接得到前k个元素的数组拷贝。

import java.util.ArrayList;
import java.util.Arrays;

public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> ret = new  ArrayList<Integer>();
        if (k > input.length){ // 本题说明条件
            return ret; // 空数组
        }
        Arrays.sort(input);
        for (int i = 0; i < k; i++) {
            ret.add(input[i]);
        }
        return ret; 
    }
}

方法二:快排

只需要找到位置在k处的哨兵即可,不需要完全排序

import java.util.ArrayList;

public class Solution{
    private void QuickSort(int[] input, int l, int r, int k){
        if (l >= r) return;
        int key = input[l];
        int i = l,j = r;

        while (i < j) {
            // 从右开始找大的
            while (i < j && input[j] >= key)
                j--;
            input[i] = input[j];
            // 从左开始找小的
            while (i < j && input[i] <= key)
                i++;
            input[j] = input[i];
        }
        // 找到哨兵位置
        input[i] = key;
        if (i+1 < k) QuickSort(input, i+1, r,k);
        if (i+1 > k) QuickSort(input, l, i-1,k);
    }
    public ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k){
        ArrayList<Integer> ret = new ArrayList<>();
        if (k > input.length){ // 本题说明条件
            return ret; // 空数组
        }
        QuickSort(input, 0, input.length-1,k);
        for (int i = 0; i < k; i++) {
            ret.add(input[i]);
        }
        return ret; 
    }
}

图片说明

全部评论

相关推荐

强大的马里奥:实力很强,考研吧,会走的更远
点赞 评论 收藏
分享
虚闻松声:继续投吧。 简历没啥问题。很优秀。 拙见:自我评价没什么意义;试试转向Agent开发、大模型应用;别死磕传统Java开发。 免费修改简历,就业咨询,欢迎私信交流。
点赞 评论 收藏
分享
01-23 19:12
门头沟学院 Java
榨出爱国基因:你还差 0.1% 就拿到校招礼盒,快叫朋友给你砍一刀吧
投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务