剑指offer-29. 最小的K个数

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

解题思路:

先对数组进行排序,然后依次打印前k个数即可

代码实现:

class Solution {
    /*
    先对数组进行排序,然后依次打印前k个数即可,时间复杂度O(n^2)
    */
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector<int> v;
        if(k>input.size()){
            return v;
        }
        for(int i=0;i<input.size();i++){
            int min = i;
            // 每轮需要比较的次数 N-i
            for (int j = i + 1; j < input.size(); j++) {
                if (input[j] < input[min]) {
                    // 记录目前能找到的最小值元素的下标
                    min = j;
                }
            }
            // 将找到的最小值和i位置所在的值进行交换
            if (i != min) {
                int tmp = input[i];
                input[i] = input[min];
                input[min] = tmp;
            }
        }
        for(int i=0;i<k;i++){
            v.push_back(input[i]);
        }
        return v;
    }
};

效率:

解题思路2:

(1) 遍历输入数组,将前k个数插入到推中;(利用PriorityQueue来做为堆的实现)
(2) 继续从输入数组中读入元素做为待插入整数,并将它与堆中最大值比较:
    如果待插入的值比当前已有的最大值小,则用这个数替换当前已有的最大值;
    如果待插入的值比当前已有的最大值还大,则抛弃这个数,继续读下一个数。
    这样动态维护堆中这k个数,以保证它只储存输入数组中的前k个最小的数,最后输出ArrayList即可

 代码实现:

import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.Comparator;
import java.util.Collections;
public class Solution {
    /*
    (1) 遍历输入数组,将前k个数插入到推中;(利用PriorityQueue来做为堆的实现)
    (2) 继续从输入数组中读入元素做为待插入整数,并将它与堆中最大值比较:
    如果待插入的值比当前已有的最大值小,则用这个数替换当前已有的最大值;
    如果待插入的值比当前已有的最大值还大,则抛弃这个数,继续读下一个数。
    这样动态维护堆中这k个数,以保证它只储存输入数组中的前k个最小的数,最后输出ArrayList即可
    ,时间复杂度O(nlogk)
    */
    public ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k){
        ArrayList<Integer> ans = new ArrayList<>();
        if (input == null || k <= 0 || k > input.length) {
            return ans;
        }
        PriorityQueue<Integer> queue = new PriorityQueue<>(k, Collections.reverseOrder());
 
        for (int i = 0; i < input.length; i++) {
 
            if (queue.size() < k) {
                queue.add(input[i]);
            } else {
                if (input[i] < queue.peek()) {
                    queue.remove();
                    queue.add(input[i]);
                }
            }
        }
        while (!queue.isEmpty()) {
            ans.add(queue.remove());
        }
        return ans;
    }
}

效率:

 
发布了89 篇原创文章 · 获赞 0 · 访问量 912

猜你喜欢

转载自blog.csdn.net/qq_34449717/article/details/104206894