这个题目最坑的是 这个输入的k是几 那么输出的个数就是几 如果全是重复的 比如[1,1,1,1,1,1,1]

如果k=2 那么只能输出[1,1] 题目给的这两个样例完全不能体现这一点啊! 而且第一个样例这个[1,2] [2,1]

完全是误导我输出一个有序数列啊 最过分的是 这道题给的错误样例也是一个有序数组啊,但其实根本不需要输出的数组是有序的!只有数字全都有就行了啊 能不能严谨一些啊

/*** 输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。** 示例 1:* 输入:arr = [3,2,1], k = 2* 输出:[1,2] 或者 [2,1]** 示例 2:* 输入:arr = [0,1,2,1], k = 1* 输出:[0]** 限制:* 0 <= k <= arr.length <= 10000* 0 <= arr[i] <= 10000** 来源:力扣(LeetCode)* 链接:https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。*/import java.util.Arrays;
import java.util.Random;class Solution {public int[] getLeastNumbers(int[] arr, int k)  {Random rnd = new Random();if (k == 0)return Arrays.copyOf(arr, 0);Sort(arr, 0, arr.length-1, rnd, k);return Arrays.copyOf(arr, k);}private static int Sort(int[] arr, int l, int r, Random rnd, int k) {int p = l + rnd.nextInt(r-l+1);swap(arr, l, p);// arr[l+1, lt] < 0  || arr[lt+1, i-1] =0 || arr[gt, r] > 0int lt = l, gt = r+1, i = l+1;while (i < gt) {if (arr[i] < arr[l]) {lt++;swap(arr, lt, i);i++;} else if (arr[i] == arr[l]) {i++;} else {gt--;swap(arr, gt, i);}}// 将l与lt交换swap(arr, l, lt);// 数组变为 arr[l, lt-1] < 0 || arr[lt, gt-1] = 0 || arr[gt, r] > 0if (lt <= k-1 && k-1 <= gt-1)return gt-1;else if (gt-1 < k-1) {return Sort(arr, gt, r, rnd, k);} else {return Sort(arr, l, lt-1, rnd, k);}}private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}public static void main(String[] args) {int[] arr = {1,1,1,1,1,1};int[] res = new Solution().getLeastNumbers(arr,2);for (int a :res) {System.out.print(a + " ");}}}

剑指offer40 最小的k个数相关推荐

  1. 剑指offer 最小的k个数 leetcode 215. Kth Largest Element in an Array

    注意multiset的一个bug: multiset带一个参数的erase函数原型有两种.一是传递一个元素值,如上面例子代码中,这时候删除的是集合中所有值等于输入值的元素,并且返回删除的元素个数:另外 ...

  2. 剑指Offer_29_最小的K个数

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解题思路 解法1 大顶堆,存放k个数字,遍历数组,当堆的数量小于k ...

  3. 剑指offer 最小的k个数

    输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 排序解决的. import java.util.*; public clas ...

  4. 剑指offer——最小的K个数和数组中第K大的元素

    解题思路: 乘着做这个题,顺便复习下堆排序. 先说堆排序是一个什么东西:https://blog.csdn.net/u013384984/article/details/79496052 大顶堆升序, ...

  5. 29、剑指offer--最小的K个数

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解题思路:使用multiset存储k个最小值 1)先存入k个值 2 ...

  6. 【Java】 剑指offer(40) 最小的k个数

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7 ...

  7. 《剑指offer》最小的k个数

    题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解析:剑指offer刷到现在,大家可能都有个很大的感触,那就是要非常熟 ...

  8. C#刷剑指Offer | 【常考题】最小的k个数

    [C#刷题]| 作者 / Edison Zhou 这是EdisonTalk的第299篇学习分享 我们来用之前学到的数据结构知识来刷<剑指Offer>的一些核心题目(精选了其中30+道题目) ...

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

    [LeetCode]剑指 Offer 40. 最小的k个数 文章目录 [LeetCode]剑指 Offer 40. 最小的k个数 一.笨比解法 二.堆排序 三.快速选择 总结 一.笨比解法 选择排序变 ...

最新文章

  1. 图解Java 开发教程
  2. ABP vNext微服务架构详细教程——身份管理服务
  3. 二分搜索,欧几里德算法
  4. 转帖:django下操作数据库的字符问题
  5. python实现梳排序
  6. 安装matlab2016a教程---适合小白,超详细
  7. 清空oracle的注册表,Oracle中清除注册表
  8. 软件测试用例设计规范
  9. 一文看懂STM32单片机和51单片机区别
  10. 兼容IE8的多文件上传实现
  11. C语言读取wav文件中特定内容6,c读取wav文件,头文件后面的所有数据
  12. 世界三大顶级音响_世界十大名牌音响有那些
  13. wpf 监听退出事件_如何监听WPF的WebBrowser控件弹出新窗口的事件
  14. Java的面向对象 -- 继承
  15. win10计算机用户怎么删除,Win10系统怎么管理的家庭成员账户? Win10删除账户的教程...
  16. C语言入门 -- Simple Simon 简单的西蒙游戏(2021/1/7)
  17. 搭建政务民生可视化管理系统 | 智慧城市
  18. 我用Python实现自动化办公,美女同事投来羡慕的眼神,而后···
  19. 利弗莫尔的操作系统到底是怎样的?
  20. Imagination领先IP助力国产处理器 从芯片走向解决方案

热门文章

  1. c语言数星星结构体,数星星(结构体专题)
  2. SAP License:RISE with SAP
  3. TIM SDK腾讯实时通信获取未读消息
  4. 第5章:文件类工具软件
  5. 2022年焊工(初级)操作证考试题及答案
  6. 凭什么李宇春张靓颖就不能写世界杯?
  7. 中小型棋牌类网络游戏服务端架构
  8. 以外勤人员管理博企业管理效益
  9. react项目使用百度地图API
  10. 原生JS实现飘浮关键词特效