题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
1、对它进行排序,输出前k个即可:
import java.util.*;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> list = new ArrayList();
if(k > input.length)
return list;
Arrays.sort(input);
for(int i=0;i<k;i++){
list.add(input[i]);
}
return list;
}
}
这种改变了原有的数组!
2、还可以使用快排的划分操作,是我自己写错了!
正确代码如下:
import java.util.*;
public class Solution {
public int partition(int[] input,int low,int high){
int val = input[low];
while(low < high){
while(low<high && input[high]>=val)
high--;
input[low] = input[high];
while(low<high && input[low]<val)
low++;
input[high] = input[low];
}
input[low] = val;
return low;
}
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> list = new ArrayList();
if(input == null || input.length == 0 || k > input.length || k <= 0)
return list;
int low = 0;
int high = input.length-1;
int index = partition(input,low,high);
while(index != k-1){
if(index > k-1)
index = partition(input,low,index-1);
else
index = partition(input,index+1,high);
}
for(int i=0;i<k;i++){
list.add(input[i]);
}
return list;
}
}
下面是错误的代码:非常深刻!!其实错误点是忽略了k=0的情况!也就是边界的判断,造成了下面index和k-1= -1 的情况,index最后肯定返回0,0肯定会大于-1,然后无限的循环下去了。
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> list = new ArrayList();
if(k > input.length)
return list;
int index = partition(input,0,input.length - 1);
while(index != k-1){
if(index > k-1)
index = partition(input,0,index - 1);//low
else
index = partition(input,index+1,input.length - 1);//high
}
for(int i=0;i<k;i++){
list.add(input[i]);
}
return list;
}
一开始,我以为是low和high的赋值出错了,但是我这样写的竟然也AC了,以后尽量使用low和high来标明吧?这还是有疑问的//貌似,难道下标小者越小,大者越大吗?
3、不改变原数组的话,可以使用TreeSet容器:
import java.util.*;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> list = new ArrayList();
if(k > input.length)
return list;
TreeSet<Integer> treeSet = new TreeSet();
for(int i=0;i<input.length;i++){
treeSet.add(input[i]);
}
int i = 0;
for(Integer item : treeSet){
if(i == k)
break;
list.add(item);
i++;
}
return list;
}
}