输入整数数组 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;
}
}