本文共 3311 字,大约阅读时间需要 11 分钟。
方法一:使用Java的Arrays.sort
这个方法简单直接,但需要注意,当k小于等于数组长度时,可以直接使用Arrays.sort并截取前k个元素。代码如下:import java.util.Arrays;public class Solution { public int[] getLeastNumbers(int[] arr, int k) { if (k <= 0) { return new int[0]; } Arrays.sort(arr); int[] res = new int[k]; System.arraycopy(arr, 0, res, 0, k); return res; }}
方法二:快速排序配合二分法
这种方法体现了一种高效的分治策略。首先确定基准点,然后划分数组区域进行递归排序,并根据k的位置调整范围。实现细节如下:public class Solution { public int[] getLeastNumbers(int[] arr, int k) { if (k <= 0 || arr.length <= 0) { return new int[0]; } if (k >= arr.length) { return arr; } return quickSort(arr, k, 0, arr.length - 1); } private int[] quickSort(int[] arr, int k, int left, int right) { int l = left; int r = right; while (l < r) { while (l < r && arr[r] >= arr[l]) { r--; } while (l < r && arr[l] <= arr[l + 1]) { l++; } swap(arr, l, r); swap(arr, l, l + 1); } if (k <= l) { return Arrays.copyOf(arr, k); } else { int[] leftPart = quickSort(arr, k, 0, l - 1); return merge(leftPart, arr, k, l, r); } } private void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } private int[] merge(int[] left, int[] arr, int k, int l, int r) { int[] rightPart = Arrays.copyOf(arr, r - l + 1); int count = 0; int i = 0; int j = 0; int[] result = new int[k]; while (i < left.length && count < k) { if (left[i] < rightPart[j]) { result[count++] = left[i]; i++; } else { result[count++] = rightPart[j]; j++; count++; if (count == k) { return result; } } } return result; }}
方法三:使用优先队列(大根堆)
优先队列适合处理需要频繁获取最小值的场景。这里使用大根堆来维护前k小的数,确保堆顶是当前最小的。实现代码如下:import java.util.*;public class Solution { public int[] getLeastNumbers(int[] arr, int k) { if (k <= 0 || arr.length == 0) { return new int[0]; } PriorityQueueheap = new PriorityQueue<>((v1, v2) -> v2 - v1); for (int num : arr) { if (heap.size() < k) { heap.add(num); } else { if (num < heap.peek()) { heap.remove(); heap.add(num); } } } int[] res = new int[k]; for (int i = 0; i < k; i++) { res[i] = heap.remove(); } return res; }}
方法二详解
方法三详解
方法一
方法二
方法三
通过对比,可以根据不同的需求选择最合适的方法。总的来说,方法二和方法三在不同数据规模和k值时表现优异。
转载地址:http://flzrz.baihongyu.com/