leetcode——面试题 17.14. 最小K个数 (java快速排序)

描述:设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。

输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]

解题思路:

这题因为不要求排序,所以思路很多,我自己想的思路有下面的两种

1.建立一个k个长度的数组result,先将原来arr数组中前4项装进去,用一个变量m记录结果result数组中的最大值的位置(这个找的时候,需要用一下排序算法,比如冒泡排序的第一遍或者快排之类的),从第五项遍历到最后一项(这个地方也可以用二分查找),arr中比result[m]小的就替换result[m],这个就是我临时想了一下,可能有误

2.这个我采用的是整个arr数组进行快速排序(不能用冒泡,复杂度高了会超时),如此整个数组为从小到大的有序状态,通过java.util.Arrays.copyof(arr,k)返回前k项。

class Solution {
    public int[] smallestK(int[] arr, int k) {
        int left = 0;
        int right = arr.length-1;
        quickSort(arr,0,arr.length-1);
        int[] a =java.util.Arrays.copyOf(arr,k);
        return a;
    }
    void quickSort(int arr[],int begin,int end)
    {
        //如果区间不只一个数
        if(begin < end)
        {
            int temp = arr[begin]; //将区间的第一个数作为基准数
            int i = begin; //从左到右进行查找时的“指针”,指示当前左位置
            int j = end; //从右到左进行查找时的“指针”,指示当前右位置
            //不重复遍历
            while(i < j)
            {
                while(i temp)
                    j--;
                //将右边小于等于基准元素的数填入右边相应位置
                arr[i] = arr[j];
            
                while(i

 

你可能感兴趣的:(leetcode刷题)