JZ29 最小的K个数

  • 思路:
    • 方法一:重建一个优先队列,将数组中的k个数加入队列,如果数组中的元素小于队列中的头元素,队列进行poll操作,然后加入数组元素
    • 方法二:
          //使用快排(快排需要找基准)进行前k项排序
              //思路:对于数组[l, r]一次快排partition过程可得到,[l, p), p, [p+1, r)三个区间,
              //[l,p)为小于等于p的值, [p+1,r)为大于等于p的值。
              //1、如果[l,p), p,也就是p+1个元素(因为下标从0开始),如果p+1 == k, 找到答案
              //2、如果p+1 < k, 说明答案在[p+1, r)区间内,
              //3、如果p+1 > k , 说明答案在[l, p)内
  • 时间:2021年8月17号
import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.lang.Math;


public class Solution {
    int[] nums;
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        //方法一:
        //思路:重建一个优先队列,将数组中的k个数加入队列,如果数组中的元素小于队列中的头元素,队列进行poll操作,然后加入数组元素
            //时间复杂度:O(nlogk) 空间复杂度:O(k)
        ArrayList<Integer> ans = new ArrayList<>();

        if (k == 0)
            return ans;

        /* PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer n1, Integer n2) {
                return n2 - n1;//队列中的最大值在头顶
            }
        });
        int count = 0; //记录队列中的数据个数
        for (int i = 0; i < input.length; i++) {
            if (count < k) {
                queue.add(input[i]);
                count++;
            } else {
                if (input[i] < queue.peek()) {
                    queue.poll();
                    queue.add(input[i]);
                }
            }
        }

        while (!queue.isEmpty()) {
            ans.add(queue.poll());
        }

        return ans; */

        //方法二:
        //使用快排(快排需要找基准)进行前k项排序
            //思路:对于数组[l, r]一次快排partition过程可得到,[l, p), p, [p+1, r)三个区间,
            //[l,p)为小于等于p的值, [p+1,r)为大于等于p的值。
            //1、如果[l,p), p,也就是p+1个元素(因为下标从0开始),如果p+1 == k, 找到答案
            //2、如果p+1 < k, 说明答案在[p+1, r)区间内,
            //3、如果p+1 > k , 说明答案在[l, p)内
        //下面的结果并没有将数组进行处理
        /* nums = input;
        int l = 0, r = input.length;
        while (l < r) {
            int p = partition(l, r);
            System.out.println(p);
            if (p+1 == k) {
                for (int i = 0; i < k; i++) {
                    ans.add(nums[i]);
                }
                return ans;
            } else if (p+1 < k) {
                l = p + 1;
            } else {
                r = p;
            }
        }

        return ans;*/

        //方法三:
        for (int i = 0; i < Math.min(input.length - 1, k); i++) {
            for (int j = i + 1; j < input.length; j++) {
                if (input[i] > input[j]) {
                    int temp = input[i];
                    input[i] = input[j];
                    input[j] = temp;
                }
            }

        }
        for (int i = 0; i < k; i++) {
            ans.add(input[i]);
        }
        return ans;
    }

    public int partition(int l, int r) {
        int pivot = nums[r-1];
        int i = l;
        for (int j = l; j < r-1; j++) {
            if (nums[j] < pivot) {
                swap(nums[i++], nums[j]);
            }
        }
        swap(nums[i], nums[r-1]);
        return i;
    }

    public void swap(int num1, int num2) {
        int temp = num1;
        num1 = num2;
        num2 = temp;
    }    
}
全部评论

相关推荐

就前几天旅游的时候,打开抖音就经常刷到这类视频:以前是高学历学生、老师、主持人,现在做着团播、擦边主播的工作,以及那些经过精心包装的“职业转型”故事——从铺天盖地的VLOG到所谓的“04年夜场工作日记”,这些内容在初中升学、高考放榜等关键时间节点持续发酵。可以说非常直接且精准地在潜移默化地影响着心智尚未成熟的青少年,使其对特殊行业逐渐脱敏。那我就想问了:某些传播公司、平台运营者甚至某些夜场的老板,你们究竟在传递怎样的价值观?点开那些视频,评论区里也是呈现明显的两极分化:一种是​​经济下行论​​:“现在就业市场已经艰难到这种程度了吗?”​​一种是事实反驳派​​:这些创作者往往拥有名校背景,从事着...
牛客刘北:被环境教育的,为了能拿到足够的钱养活自己,不甘心也得甘心,现在的短视频传播的思想的确很扭曲,但是很明显,互联网玩上一年你就能全款提A6,但你全心全意不吃不喝工作一年未必能提A6,但是在高考中考出现这个的确很扭曲,在向大家传播“不上学,玩互联网也可以轻松年入百万”,不是人变了,是社会在变
预测一下26届秋招形势
点赞 评论 收藏
分享
真烦好烦真烦:牛友太有实力了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务