欢迎来到尧图网

客户服务 关于我们

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

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

2025/5/6 7:07:52 来源:https://blog.csdn.net/m0_73997214/article/details/147703447  浏览:    关键词:[三分钟学算法]分治-快速排序-最小的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;}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词