剑指offer——最小的K个数

本文介绍了一种寻找数组中最小K个数的方法,通过判断K的大小并使用从大到小的排序策略,选取排序后末尾的K个数作为结果,最后用Java代码实现了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

剑指offer——最小的K个数

问题描述

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

思路分析

1.先判断K的大小,若K大于输入的数字个数,则返回所有的这些数。
2.对输入的这组数进行排序,此处是从大到小进行排序,然后选取排序后末尾的K个数。
补充:
排序的相关问题,会再写一篇博客说明。

代码

import java.util.ArrayList;  
import java.util.Scanner;  
  
class Solution{  
    public ArrayList<Integer> GetLeastNumbers_Solution(int[] input,int k){  
         ArrayList<Integer> al = new ArrayList<Integer>();  
        if (k > input.length) {  
            return al;  
        }  
        for (int i = 0; i < k; i++) {  
            for (int j = 0; j < input.length - i - 1; j++) {  
                if (input[j] < input[j + 1]) {  
                    int temp = input[j];  
                    input[j] = input[j + 1];  
                    input[j + 1] = temp;  
                }  
            }  
            al.add(input[input.length - i - 1]);  
        }  
        return al;  
    }  
}  
### 剑指Offer书籍主要内容 《剑指Offer》是一本专注于编程面试的经典书籍,涵盖了大量经典的算法和数据结构问题[^3]。书中通过一系列精心设计的题目,帮助读者深入理解和掌握各种常见算法及其应用场景。 #### 数据结构与基础算法 该书的基础部分主要围绕经典的数据结构展开讨论,包括但不限于链表、栈、队列以及二叉树等内容。例如,在处理链表时,《剑指Offer》提供了诸如“从尾到头打印单向链表”的解决方案[^4];而在探讨二叉树方面,则有“顺时针打印矩阵”、“二叉树的镜像”等问题的具体分析方法[^2]。 #### 高级主题与复杂度优化 随着内容推进,本书逐渐引入更复杂的概念和技术手段来解决问题。比如,“最小的K个数”这一章节介绍了如何利用堆或者快速选择算法高效获取集合中小于指定数量的部分元素;还有关于动态规划的应用实例——“整数中1出现的次数”,它教会我们怎样通过状态转移方程减少不必要的计算量从而提升效率。 #### 实际应用案例研究 为了增强实战能力,《剑指Offer》还特别挑选了一些具有代表性的实际工程场景下的挑战作为练习素材。其中包括“扑克牌顺子”这样趣味性强又考察思维灵活性的小游戏型试题[^2],也有类似于“孩子们的游戏(圆圈中最后剩下的数)”这种需要巧妙运用数学原理才能完美解答的大规模模拟类难题[^4]。 --- ### 解题思路举例说明 以下是几个典型例子及其对应的解题策略: #### 示例一:二进制中1的个数 对于给定的一个整数,统计其二进制形式下有多少位为`1`。可以通过不断右移操作配合掩码检测每一位是否等于`1`完成计数过程。 ```python def count_ones(n): count = 0 while n != 0: count += (n & 1) n >>= 1 return count ``` #### 示例二:数值的整数次方 实现一个函数用于计算某个底数base以指数exponent相乘的结果。需要注意当指数小于零的情况特殊对待,并且考虑浮点误差带来的影响。 ```python def power(base, exponent): if base == 0 and exponent < 0: raise ValueError("Invalid input") abs_exponent = -exponent if exponent < 0 else exponent result = 1 for _ in range(abs_exponent): result *= base return 1 / result if exponent < 0 else result ``` #### 示例三:丑数 定义所谓的‘丑数’是指仅含质因子2、3或5的正整数序列中的某一项位置上的值是多少?采用动态规划的思想预先存储已知较小范围内的所有符合条件候选者再逐步扩展直至满足目标长度为止。 ```python def get_ugly_number(index): if index <= 0: return 0 ugly_numbers = [1] i2,i3,i5=0,0,0 next_multiple_of_2,next_multiple_of_3,next_multiple_of_5=2,3,5 while len(ugly_numbers)<index: min_val=min(next_multiple_of_2,next_multiple_of_3,next_multiple_of_5) ugly_numbers.append(min_val) if min_val==next_multiple_of_2:i2+=1;next_multiple_of_2=ugly_numbers[i2]*2; if min_val==next_multiple_of_3:i3+=1;next_multiple_of_3=ugly_numbers[i3]*3; if min_val==next_multiple_of_5:i5+=1;next_multiple_of_5=ugly_numbers[i5]*5; return ugly_numbers[-1] ``` --- ### 总结 通过对以上几大板块的学习与实践训练,可以有效提高个人解决各类计算机科学领域内核心理论及技术难点的能力水平。同时也能培养良好的编码习惯与严谨细致的工作态度,这对于准备求职尤其是针对互联网行业相关岗位而言至关重要[^1]^。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值