当前位置: 首页 > news >正文

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

文章目录

  • 题目详情
  • 算法原理
  • 编写代码

题目详情

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

示例:

输入: 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. 分类讨论
    在这里插入图片描述

编写代码

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. 随机选择一个基准元素keyint 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;}
}

相关文章:

  • 【数据结构】稀疏矩阵的快速转置
  • 架构思维:异构数据的同步一致性方案
  • P1802 5 倍经验日
  • 递归算法详解(Java 实现):从原理到高阶应用
  • 时序分解 | Matlab基于WOA-MVMD鲸鱼算法优化多元变分模态分解
  • 机器学习实操 第二部分 神经网路和深度学习 第11章 训练深度神经网络
  • GenCLS++:通过联合优化SFT和RL,提升生成式大模型的分类效果
  • 人工智能数学基础(八)—— 最优化理论
  • 生物化学笔记:神经生物学概论09 小脑的运动学习 基底神经节的结构与功能
  • C++八股--6--mysql 日志与并发控制
  • 永磁同步电机无速度算法--基于ESO-PLL的永磁同步电机无位置传感器控制
  • 2025年PMP 学习二
  • 第一章 - 质量
  • C++学习:六个月从基础到就业——C++11/14:右值引用与移动语义
  • Docker安装Gitblit(图文教程)
  • llfc项目笔记客户端TCP
  • 代码随想录算法训练营Day44
  • 2025深圳杯东三省数学建模竞赛B题完整分析论文(共27页)(含模型、可运行代码、求解结果)
  • 力扣1128题解
  • C# 定时器实现
  • 黎巴嫩9年来首次举行地方选举
  • 申活观察|精致精准精细,城市“双面镜”照见怎样的海派活力
  • 2025上海车展圆满闭幕,共接待海内外观众101万人次
  • 德国旅游胜地发生爆炸事故,11人受伤
  • 启程回家!神十九轨道舱与返回舱成功分离
  • 国台办:相关优化离境退税政策适用于来大陆的台湾同胞