题目描述
https://leetcode-cn.com/problems/smallest-k-lcci/
解法
使用快排,然后根据输入的K,我们决定接下来递归哪一边:
class Solution {
public int[] smallestK(int[] arr, int k) {
if(arr.length==0) return new int[0];
int []res = new int[k];
quickSort(arr,0,arr.length-1,k);
for(int i=0;i<k;i++){
res[i] = arr[i];
}
return res;
}
public void quickSort(int[]num,int start,int end,int k){
int base = num[start];
int i = start,j=end;
while(i<j){
while(i<j && num[j]>base){
j--;
}
while(i<j && num[i]<base){
i++;
}
if( num[i]==num[j] && i<j){
i++;
}else{
//使用异或交换两个数,从小到达排序
if(num[i]!=num[j]){
//必须要判断喔
num[i] = num[i]^num[j];
num[j] = num[i]^num[j];
num[i] = num[i]^num[j];
}
}
}
if(i==k-1)//表示现在我们要找的是左边
return;//已经找够了k个最小的数了
else if(i-1>start && i>k-1){
//只需要排左边
quickSort(num,start,i-1,k);//
}
else if(j+1<end && i<k-1) {
//注意这里
quickSort(num,j+1,end,k);
}
}
}
这里我遇到一个问题:
if(nums[i]!=nums[j]){
//使用之前注意判断是否已经相同了
nums[i] = (nums[i])^(nums[j]);
nums[j] = (nums[i])^(nums[j]);
nums[i] = (nums[i])^(nums[j]);
}
这里想装逼的,记得加上判断是否已经相等,如果相等,那你永远得到的是0。
解法上,当然 可以直接用排序,然后取前k个数了。但是快排这样做效率高很多。