【剑指 Offer 40】最小的k个数

这篇具有很好参考价值的文章主要介绍了【剑指 Offer 40】最小的k个数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目:

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

示例:

输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]

输入:arr = [0,1,2,1], k = 1
输出:[0]

思考:

  • 找到一个数组中最小的 k 个数,得出要对该数组进行排序

  • 排序算法该如何选择呢?

  • 根据题目要求,不要求输出的这 k 个数的顺序,考虑使用快速排序

  • 因为是输出最小的 k 个数,索引从 0 开始,所以当基准数为 k+1 小的数时,这个基准数的左边子数组就是我们要找的 k 个数,也就是基准数索引为 k 时

  • 使用快速排序划分子数组,每划分一次看基准数索引是否等于 k

  • 若 k < 基准数索引 ,代表第 k+1 小的数字在 左子数组 中,则递归左子数组

  • 若 k > 基准数索引 ,代表第 k+1 小的数字在 右子数组 中,则递归右子数组

  • 否则直接返回数组前 k 个数字文章来源地址https://www.toymoban.com/news/detail-637331.html

题解:

class Solution {
    public int[] getLeastNumbers(int[] arr, int k) {
        if (k >= arr.length) return arr;
        return quickSort(arr, k, 0, arr.length-1);
    }

    private int[] quickSort(int[] arr, int k, int l, int r){
        int i = l, j = r;
        while (i<j){
            while (i<j && arr[j] >= arr[l]) j--;
            while (i<j && arr[i] <= arr[l]) i++;
            swap(arr,i,j);
        }
        swap(arr,i,l);
        //基准数索引 > k,递归左子数组
        if (i > k) return quickSort(arr, k, l, i-1);
        //基准数索引 < k,递归右子数组
        if (i < k) return quickSort(arr, k, i+1, r);

        return Arrays.copyOf(arr, k);
    }
    //交换方法
    private void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
}

到了这里,关于【剑指 Offer 40】最小的k个数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 剑指offer刷题笔记--Num21-30

    目录 1--调整数组顺序使奇数位于偶数前面(21) 2--链表中倒数第 k 个节点(22) 3--反转链表(24) 4--合并两个排序的链表(25) 5--树的子结构(26) 6--二叉树的镜像(27) 7--对称的二叉树(28) 8--顺时针打印矩阵(29) 9--包含min函数的栈(30) 主要思路:         双指针

    2024年02月12日
    浏览(42)
  • 【leetcode刷题之路】剑指Offer(3)——搜索与回溯算法

    7 搜索与回溯算法 7.1 【BFS】剑指 Offer 32 - I - 从上到下打印二叉树 https://leetcode.cn/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof/   这里借助队列来实现广度优先遍历,由于需要访问每一层的节点,而且这一层访问才可以访问下一层,所以可以考虑队列的先进先出,先把每一层的节

    2024年02月13日
    浏览(56)
  • 《剑指offer》(3)排序算法篇

    class Solution:     def duplicate(self , numbers: List[int]) - int:         if len(numbers) = 1:             return -1         import collections         num_dict = collections.Counter(numbers)         res = [key for (key,value) in num_dict.items() if value 1]         return res[0] class Solution:     def sort(self,num): #快排

    2024年02月13日
    浏览(36)
  • 刷题笔记【5】| 快速刷完67道剑指offer(Java版)

    本文已收录于专栏 🌻 《刷题笔记》 题目来源参考阿秀学长的刷题笔记,小戴只是把 C++的题解改成了 Java版本,并整理了其他思路,便于自己的学习~ 如果解题有更好的方法,本文也会及时进行更新~ 希望对你有帮助~ 一起加油哇~ 牛客原题链接 输入两个递增的链表,单个链表

    2023年04月12日
    浏览(38)
  • 分冶算法 剑指 07 重建二叉树 排序算法:剑指45 把数组排成最小的数 10-I 斐波那契数列

    来记录几个注意事项 1.vector容器里利用find()函数 不同于map(map有find方法),vector本身是没有find这一方法,其find是依靠algorithm来实现的。 所以要包含头文件 另外返回类型并不是int 类型的索引 iterator迭代器类型的 2.关于在vector容器里根据找寻到的位置进行切片,前面为新

    2024年02月15日
    浏览(38)
  • 剑指 Offer 15. 二进制中1的个数 / LeetCode 191. 位1的个数(位运算)

    链接:剑指 Offer 15. 二进制中1的个数;LeetCode 191. 位1的个数 难度:简单 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。 提示: 请注意,在某些语言(如 Java)中,没有无符号整数类型。

    2024年02月12日
    浏览(45)
  • 《剑指offer》——刷题日记

    本期,给大家带来的是《剑指offer》几道题目的讲解。希望对大家有所帮助!!! 本文目录 (一)JZ36 二叉搜索树与双向链表 1、题意分析 2、思路讲解 3、代码演示 4、最终结果 (二)BM6 判断链表中是否有环 1、题意分析 2、思路讲解 3、代码演示 4、最终结果 (三)JZ23 链

    2023年04月21日
    浏览(39)
  • 【剑指 offer】旋转数组的最小数字

    ✨个人主页:bit me👇 ✨当前专栏:算法训练营👇 核心考点:数组理解,二分查找,临界条件 描述: 有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这

    2023年04月20日
    浏览(50)
  • 【leetcode刷题】剑指offer基础版(完结)

    剑指 Offer 05. 替换空格 剑指 Offer 58 - II. 左旋转字符串 剑指 Offer 67. 把字符串转换成整数❤️ 剑指 Offer 06. 从尾到头打印链表 剑指 Offer 24. 反转链表 剑指 Offer 35. 复杂链表的复制 剑指 Offer 18. 删除链表的节点 剑指 Offer 22. 链表中倒数第k个节点 剑指 Offer 25. 合并两个排序的链表

    2024年02月09日
    浏览(44)
  • 剑指offer45 把数组排成最小的数

    链接 其实这道题,大概看完就知道是一个排序的问题,无非就是数组中的元素以一个合适的位置排好序,这样从头加到尾,组成的整体数字最小!(题目中也暗示你排序问题了) 个人捉摸了一会,这道题能很好地锻炼仿函数的编写规则和库函数sort()的配套使用,还有就是巧妙地

    2024年01月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包