好久没有写博客了,处于对于编程的热爱,我又回来了
回到这个问题,总共有两种思路
1、1)建立一个ArrayList,先存进去前k个数,接着从小到大排序
2)从这个n个数的第k+1数开始和ArrayList最后的一个数比较,如果比最后一个数小,就替换。接着排序。
3)重复上一个过程,直到所有的数遍历完毕。
import java.util.ArrayList; public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { ArrayList<Integer> kArray = new ArrayList<Integer>(); if (k > input.length || k == 0) { return kArray; } for(int i = 0;i < k; i++) { kArray.add(input[i]); } kArray.sort(null); /*for (int i = 0;i < k; i++) { System.out.print(kArray.get(i)); } System.out.println();*/ for (int i = k; i < input.length; i++) { if (kArray.get(kArray.size() - 1) > input[i]) { kArray.remove(kArray.size() - 1); kArray.add(input[i]); kArray.sort(null); } } return kArray; } } 添加笔记
2、思路同上,但是这次中间过程采用存n个数的容器不是ArrayList,而是改为最大值堆,也就是使用优先队列
package com.example.test; import java.util.ArrayList; import java.util.Comparator; import java.util.Iterator; import java.util.PriorityQueue; import java.util.function.Function; import java.util.function.ToDoubleFunction; import java.util.function.ToIntFunction; import java.util.function.ToLongFunction; public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { ArrayList<Integer> kArray = new ArrayList<Integer>(); //如果想要得到的k个数目比n还大,返回k空的ArrayList if (k > input.length || k == 0) { return kArray; } class InternalComparator implements Comparator<Integer>{ public int compare(Integer arg0, Integer arg1) { // TODO Auto-generated method stub if (arg0.intValue() < arg1.intValue()) { return 1; } else if (arg0.intValue() == arg1.intValue()) { return 0; } return -1; } } InternalComparator paramComparator = new InternalComparator(); PriorityQueue<Integer> pq = new PriorityQueue<Integer>(paramComparator); //添加k个数 for(int i = 0;i < k; i++) { pq.add(input[i]); } // for (Iterator<Integer> i = pq.iterator(); i.hasNext(); ) { // System.out.println(i.next()); // } // System.out.println(); //删除并新添加 for (int i = k; i < input.length; i++) { if (input[i] < pq.element()) { pq.remove(); pq.add(input[i]); } } kArray.addAll(pq); kArray.sort(null); return kArray; } public static void main(String []args) { int input[] = {4,5,1,6,2,7,3,8}; ArrayList<Integer> kArray = new Solution().GetLeastNumbers_Solution(input, 4); if (kArray.size() != 4) { return; } for (int i = 0;i < 4; i++) { System.out.print(kArray.get(i)); } System.out.println(); } }