• 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();
        }
    }
  • 相关阅读:
    记一次centos 服务器中毒事件
    heatmap
    this
    购物车
    带标签的无缝轮播
    无缝轮播
    图片滚动百分百宽度
    选择排序
    冒泡排序
    tab标签页
  • 原文地址:https://www.cnblogs.com/adamhome/p/7886287.html
Copyright © 2020-2023  润新知