一、题目内容

image.png

二、题解

解法1:

思路

使用大顶堆,堆顶保存最小数集合的最大值;构建堆完成后依次入堆,判断当前元素小于堆顶则置换,之后重新调整堆,使堆内数据均小于堆顶。

代码

  1. public class Solution {
  2. public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
  3. ArrayList<Integer> result = new ArrayList<Integer>();
  4. if(input == null || k == 0){
  5. return result;
  6. }
  7. int[] maxHeapArr = new int[k];
  8. int i;
  9. for(i=0;i<k;i++){
  10. maxHeapArr[i] = input[i];
  11. }
  12. buildMaxHeap(maxHeapArr);
  13. for(;i<input.length;i++){
  14. if(input[i]<maxHeapArr[0]){
  15. maxHeapArr[0] = input[i];
  16. adjustMaxHeap(maxHeapArr,0);
  17. }
  18. }
  19. for(int num:maxHeapArr){
  20. result.add(num);
  21. }
  22. return result;
  23. }
  24. public void buildMaxHeap(int[] maxHeapArr){
  25. for(int k = maxHeapArr.length/2-1;k>=0;k--){
  26. adjustMaxHeap(maxHeapArr,k);
  27. }
  28. }
  29. public void adjustMaxHeap(int[] maxHeapArr,int adjustPos){
  30. int len = maxHeapArr.length;
  31. int temp = maxHeapArr[adjustPos];
  32. for(int k = adjustPos*2+1;k<len;k=k*2+1){
  33. if(k+1<len&&maxHeapArr[k]<maxHeapArr[k+1]){
  34. k++;
  35. }
  36. if(maxHeapArr[k]>temp){
  37. maxHeapArr[adjustPos] = maxHeapArr[k];
  38. adjustPos = k;
  39. }else{
  40. break;
  41. }
  42. }
  43. maxHeapArr[adjustPos] = temp;
  44. }
  45. }