描述:设计一个算法,找出数组中最小的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(i<j && arr[j] > temp)
j--;
//将右边小于等于基准元素的数填入右边相应位置
arr[i] = arr[j];
while(i<j && arr[i] <= temp)
i++;
//将左边大于基准元素的数填入左边相应位置
arr[j] = arr[i];
}
//将基准元素填入相应位置
arr[i] = temp;
//此时的i即为基准元素的位置
//对基准元素的左边子区间进行相似的快速排序
quickSort(arr,begin,i-1);
//对基准元素的右边子区间进行相似的快速排序
quickSort(arr,i+1,end);
}
//如果区间只有一个数,则返回
else
return;
}
}