[三分钟学算法]分治-快速排序-最小的K个数:设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。

文章目录

题目详情

题目链接

设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。

示例:

java 复制代码
输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]

提示:

0 <= len(arr) <= 100000

0 <= k <= min(100000, len(arr))

算法原理

我们可以用快速选择算法来解决:

  1. 随机选择一个基准元素key
  2. 递归地将数组分成三部分:<key区;=key区;>key区。
  3. 分类讨论

编写代码

java 复制代码
class Solution {
    public int[] smallestK(int[] nums, int k) {
        qsort(nums, 0, nums.length - 1, k);

        int[] ret = new int[k];
        for (int i = 0; i < k; i++)
            ret[i] = nums[i];
        
        return ret;
    }

    public void qsort(int[] nums, int l, int r, int k) {
        if (l >= r) return; // 递归出口

        // 1. 随机选择一个基准元素key
        int key = nums[new Random().nextInt(r - l + 1) + l];
        int left = l - 1, right = r + 1, i = l;

        //2. 将数组分成三块
        while (i < right) {
            if (nums[i] < key) swap(nums, ++left, i++);
            else if (nums[i] == key) i++;
            else swap(nums, --right, i);
        }

        // 3.分类讨论
        int a = left - l + 1, b = right - left -1;
        if (a > k) qsort(nums, l, left, k);
        else if (a + b >= k) return;
        else qsort(nums, right, r, k - a - b);
    }

    public void swap(int[] nums, int i, int j) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
}
相关推荐
鲨莎分不晴3 小时前
强化学习第五课 —— A2C & A3C:并行化是如何杀死经验回放
网络·算法·机器学习
盖世英雄酱581363 小时前
springboot 项目 从jdk 8 升级到jdk21 会面临哪些问题
java·后端
济南壹软网络科技有限公司3 小时前
企业级盲盒系统:Java高并发架构在多元化抽奖电商中的设计与实践
java·架构·开源源码·盲盒源码·盲盒h5·盲盒app
廋到被风吹走4 小时前
【Java】常用设计模式及应用场景详解
java·开发语言·设计模式
搞科研的小刘选手4 小时前
【ISSN/ISBN双刊号】第三届电力电子与人工智能国际学术会议(PEAI 2026)
图像处理·人工智能·算法·电力电子·学术会议
拉姆哥的小屋4 小时前
从混沌到秩序:条件扩散模型在图像转换中的哲学与技术革命
人工智能·算法·机器学习
一条可有可无的咸鱼4 小时前
企业招聘信息,企业资讯进行公示
java·vue.js·spring boot·uni-app
Sammyyyyy4 小时前
DeepSeek v3.2 正式发布,对标 GPT-5
开发语言·人工智能·gpt·算法·servbay
程序猿DD4 小时前
JUnit 5 中的 @ClassTemplate 实战指南
java·后端
爱吃山竹的大肚肚4 小时前
EasyPOI 大数据导出
java·linux·windows