剑指offer_【29】最小的K个数

本文介绍了一种使用快速排序算法寻找数组中最小的K个数的方法。通过挖坑填数+分治法的快排思想,实现对输入整数数组的有效排序,并从中选取最小的K个数。

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

1.题目描述

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

2.解题思路

排序问题,本次使用快排,快排思想即:

  • 简单理解为: “挖坑填数+分治法”,
    (1)首先令i =L; j = R; 将a[i]挖出形成第一个坑,称a[i]为基准数。
    (2)然后j–由后向前找比基准数小的数,找到后挖出此数填入前一个坑a[i]中,
    (3)再i++由前向后找比基准数大的数,找到后也挖出此数填到前一个坑a[j]中。
    (4)重复进行这种“挖坑填数”直到i==j。再将基准数填入a[i]中,这样i之前的数都比基准数小,i之后的数都比基准数大。
3.代码
import java.util.*;
public class Solution {
   public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> res = new ArrayList<>();
        if(input.length<k)
            return res;
        quicksort(input, 0, input.length - 1);
        for (int i = 0; i < k; i++) {
            res.add(input[i]);
        }
        return res;
    }
    public void quicksort(int arr[], int low, int high)
    {
        if(low < high)
        {
            int position = partition(arr, low, high);
            quicksort(arr, low, position - 1);
            quicksort(arr, position + 1, high);
        }

    }
        public  int partition(int arr[], int low, int high) {
            //设置基准值
            int key = arr[low];
            while(low < high){
                //从右到左,直到找到一个小于key的值
                while(low < high && arr[high] >= key) --high;
                //将该值填入前的坑
                arr[low] = arr[high];
                //从左到右,直到找到一个大于key的值
                while(low < high && arr[low] <= key) ++low;
                //将该值填入前一个坑
                arr[high] = arr[low];
            }
            //将基准值填入最后一个坑
            arr[low] = key;
            //最后一个坑划分了左边小于该值,右边大于该值
            return low;
        }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值