J40最小的k个数

这篇博客介绍了如何使用Java实现快速排序算法找出整数数组中最小的k个数。主要内容包括Arrays.copyOf()函数的使用,以及一个名为getLeastNumbers的方法,该方法通过调用gettopk来找出数组中的最小k个数。gettopk方法内部实现了快速排序的partition过程,不断调整low和high指针以找到正确位置。
摘要由CSDN通过智能技术生成

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

  • Arrays.copyOf(原数组,新数组长度)
  • 跟找出第k个一样,只不过gettop,返回int[]
  • 快排、找出topk

Arrays.copyOf() 用法

import java.util.Arrays;

public class ArrayDemo {
	public static void main(String[] args) {
    	int[] arr1 = {1, 2, 3, 4, 5}; 
    	int[] arr2 = Arrays.copyOf(arr1, 5);
    	int[] arr3 = Arrays.copyOf(arr1, 10);
arr1:1 2 3 4 5 
arra:1 2 3 4 5 0 0 0 0 0

	}
} 

class Solution {
    public int[] getLeastNumbers(int[] arr, int k) {
        if(k==0||arr.length==0){
            return new int[]{};
        }
        return gettopk(arr,k);

    }
    //找出前k个最小的数
    int[] gettopk(int[] nums,int k){//返回的是int[]
        int low=0;
        int high=nums.length-1;
        while(true){
            int index=partition(nums,low,high);
            if(index==k-1){
                return Arrays.copyOf(nums,k);
            }
            else if(index<k-1){
            //最终返回的还是nums里的index 所以low和high的改变 不影响具体的值
                low=index+1;
            }
            else{
                high=index-1;
            }
        }
    }

    //快排
    int partition(int[] nums,int low,int high){
        int pivot=nums[low];
        while(low<high){
            while(low<high&&nums[high]>pivot){
                high--;
            }
            nums[low]=nums[high];
            while(low<high&&nums[low]<=pivot){
                low++;
            }
            nums[high]=nums[low];
        }
        nums[low]=pivot;
        return low;
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值