n个整数,求这中间最小的k个整数(Java)

好久没有写博客了,处于对于编程的热爱,我又回来了

回到这个问题,总共有两种思路

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();
    }
}
原文地址:https://www.cnblogs.com/adamhome/p/7886287.html