题解 | #最小的K个数#TOP46

思路:
1.二分法,得到index,左边的数比index位置数小,右边比它大
2.直到index == k - 1, 选择 0 到 k -1 下标的数就是最小的k个数

import java.util.*;

public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        if (input == null || input.length == 0 || k <= 0 || input.length < k) {
            return new ArrayList<Integer>();
        }
        //方法一 排序 前面k个数 O(nlogN)-O(n2)
        //方法二 快速排序中 使得左边都小于第K个元素   O(n)

        int start = 0;
        int end = input.length - 1;
        int index = parition(input, start, end);
        while(index != k - 1){
            if(index > k - 1){
                end = index - 1;
            }else {
                start = index + 1;
            }
            index = parition(input, start, end );
        }

        ArrayList<Integer> result = new ArrayList<>();
        for (int i = 0; i < k; i++) {
            result.add(input[i]);
        }
        return  result;
    }
    private static int parition(int[] data, int left, int right) {
        //随机选择二分法的基准数据
        int index = new Random().nextInt(right - left + 1);
        int value = data[index + left];
        data[index + left] = data[left];
        data[left] = value;
        int j = left;
        
        for(int i = left+1; i <= right ; i++){
            //当前j赋值i,然后下一个数放在i的位置上,j 到 i之间的数是比value大的数
            if(data[i]  < value){
                data[j] = data[i];
                j ++;
                data[i] = data[j];
            }
        }
        data[j] = value;
        return j;
    }

}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-01 11:47
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-04 15:20
牛客61197583...:看到室友一个个没怎么学通过关系直接入职或者接到面试,真的很难受。八股不知道背了多少遍,hot100也刷了1.5遍了,但就是没有面试的机会,唉
点赞 评论 收藏
分享
矫健的闭门羹烹饪师又...:本人双非本,在鹅厂测开实习,你这个简历上写的这两个项目的技术栈都差不多,能够让面试官去延伸去问的八股除了redis就再没啥了,建议项目这边可以再改改,然后专业技能那块的话,感觉linux和测试工具可以分开写,毕竟不是干一件事的,反正没实习的基础上面试就深挖项目和八股,好好卷吧
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务