600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 小k java_leetcode——面试题 17.14. 最小K个数 (java快速排序)

小k java_leetcode——面试题 17.14. 最小K个数 (java快速排序)

时间:2021-07-21 07:41:51

相关推荐

小k java_leetcode——面试题 17.14. 最小K个数 (java快速排序)

描述:设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。

输入: arr = [1,3,5,7,2,4,6,8], k = 4

输出: [1,2,3,4]

解题思路:

这题因为不要求排序,所以思路很多,我自己想的思路有下面的两种

1.建立一个k个长度的数组result,先将原来arr数组中前4项装进去,用一个变量m记录结果result数组中的最大值的位置(这个找的时候,需要用一下排序算法,比如冒泡排序的第一遍或者快排之类的),从第五项遍历到最后一项(这个地方也可以用二分查找),arr中比result[m]小的就替换result[m],这个就是我临时想了一下,可能有误

2.这个我采用的是整个arr数组进行快速排序(不能用冒泡,复杂度高了会超时),如此整个数组为从小到大的有序状态,通过java.util.Arrays.copyof(arr,k)返回前k项。

class Solution {

public int[] smallestK(int[] arr, int k) {

int left = 0;

int right = arr.length-1;

quickSort(arr,0,arr.length-1);

int[] a =java.util.Arrays.copyOf(arr,k);

return a;

}

void quickSort(int arr[],int begin,int end)

{

//如果区间不只一个数

if(begin < end)

{

int temp = arr[begin]; //将区间的第一个数作为基准数

int i = begin; //从左到右进行查找时的“指针”,指示当前左位置

int j = end; //从右到左进行查找时的“指针”,指示当前右位置

//不重复遍历

while(i < j)

{

while(itemp)

j--;

//将右边小于等于基准元素的数填入右边相应位置

arr[i] = arr[j];

while(i

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。