剑指offer T40求最大(小)的K个数

思想:
case1:利用堆来实现,要找最小的k个数则构造一个大顶堆
要找最大的k个数则构造一个小顶堆
时间复杂度为O(nlogk)
空间复杂度为O(K)
case2:先利用快速排序的区间划分思想找到第K小元素所处位置min_k,然后此时arr[]中[0,min_k]即为所求的最小的k个数

case1:

class Solution {
    public int[] getLeastNumbers(int[] arr, int k) {
     int len = arr.length;
     int[] res = new int[k];
     if(len==0) return res;   
     PriorityQueue heap = new PriorityQueue<>(len,(v1,v2)-> v2-v1);
     for(int i=0;ik){
          heap.poll();
      } 
     }  
     while(!heap.isEmpty()){
         res[--k] = heap.poll();
     }
     return res;
    }
}

case2:

class Solution {
    public void swap(int[]arr,int idx1,int idx2){
        int temp = arr[idx1];
        arr[idx1] = arr[idx2];
        arr[idx2] = temp;
    }

    public int paration(int[]arr,int start,int end){
       //产生随机哨兵
       Random r = new Random();
       int sentinelIdx = start+Math.abs(r.nextInt())%(end-start);
       //把哨兵元素给交换到队尾
       swap(arr,sentinelIdx,end);
       //将<=哨兵的元素给交换到队头
       int idx = start;
       for(int i=start;ik){
             end = j-1;
         }else{
            break;
         }
     }
     return Arrays.copyOf(arr,k); 
    }
}

你可能感兴趣的:(算法)