版权声明:转载请标明出处 https://blog.csdn.net/easy_purple/article/details/83175930
题目:
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
思路1:
排序后位于前边的k个数就是最小的数。(快排)
思路2:
创建一个大小为k的数据容器来存储最小的k个数字,如果数组为空或数组的长度小于k,直接返回空;
从输入的n个整数中一个一个读入放入该容器中,如果容器中已有k个数字,而数组中还有值未加入,此时就不能直接插入了,而需要替换容器中的值。按以下步骤进行插入
先找到容器中的最大值;
将待查入值和最大值比较,如果待查入值大于容器中的最大值,则直接舍弃这个待查入值即可;如果待查入值小于容器中的最小值,则用这个待查入值替换掉容器中的最大值;
重复上述步骤,容器中最后就是整个数组的最小k个数字。
代码1:
public static void main(String[] args) {
int[] a = { 1, 2, 6, 5, 9, 8, 3 };
sort1(a, 0, a.length - 1);
for (int i = 0; i < a.length; i++)
System.out.println(a[i]);
}
public static int division(int[] a, int left, int right) {
int base = a[left];
while (left < right) {
while (left < right && a[right] >= base)
right--;
a[left] = a[right];
while (left < right && a[left] <= base)
left++;
a[right] = a[left];
}
a[left] = base;
return left;
}
public static void sort1(int[] a, int left, int right) {
if (left >= right)
return;
int index = division(a, left, right);
sort1(a, left, index - 1);
sort1(a, index + 1, right);
}
代码2:
public static ArrayList<Integer> find(int[] input, int k) {
if (input == null)
return null;
ArrayList<Integer> list = new ArrayList<Integer>(k);
if (k > input.length)
return list;
TreeSet<Integer> tree = new TreeSet<Integer>();
for (int i = 0; i < input.length; i++) {
tree.add(input[i]);
}
int i = 0;
for (Integer elem : tree) {
if (i >= k)
break;
list.add(elem);
i++;
}
return list;
}