本题主要考察的是数组和排序的结合,下面直入正题:
题目描述:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
题目要求: 时间限制:1秒 空间限制:32768K
解题思路:
- 首先,看到题目之后,我们要查找数组中最小的K个数,就必须将K和数组的长度进行比较,只有数组的长度大于等于K,我们才能返回这K个数。
- 接着,我们怎样接受返回的K个数呢?我们就要定义一个数组,这个数组的长度为K。
- 准备工作就绪之后,我们就要开始思考怎么找到这最小的K个数?我们一定会不假思索的说排序。对,就是排序,怎么样排序才能提高效率?我们不可能把数组全部进行排序,然后取最小的K个数,这样会大大降低效率,因为我们对后面(array.length-K)个数进行排序是多余的,所以我们只需将数组进行K次排序获取最小的K个数就可以。在这里我用的是选择排序而没有用冒泡排序是因为,冒泡排序每次都要进行数据交换,太耗时,而选择排序只需要定义一个变量指向最小的值,然后再与前面的进行交换即可。
代码实现:
public class Test03 {
public int[] solution(int [] input, int k) {
//这是检查k,input.length的关系以及它们的值,若不符合要求则返回null
if(k<1||input.length<1||input.length<k){
return null;
}
//定义一个长度为k的数组,进行数据的存储
int[] dest = new int[k];
//以下是选择排序
//只需获取数组的前k项就可以了,所有我们只循环k次
for (int i = 0; i < k; i++) {
//定义一个temp变量,相当于指针
int temp = i;
//每次从第i个开始遍历,temp指向最小的那个数
for (int j = i+1; j < input.length; j++) {
if(input[temp]>input[j]){
temp = j;
}
}
//将temp指向的值与input[i]进行交换
int s = input[i];
input[i] = input[temp];
input[temp] = s;
//将input[i]的值赋值给dest[i]
dest[i] = input[i];
}
return dest;
}
public static void main(String[] args) {
Test03 test = new Test03();
int[] array = {3,4,2,8,5,6,1,7,9};
int[] dest = test.solution(array, 5);
System.out.print("运行结果:");
for(int i : dest){
System.out.print(i+" ");
}
}
}
运行结果:
运行结果:1 2 3 4 5
总结
这题主要考察的是对数组进行排序的思想,有几种常见的排序,比如冒泡排序,选择排序,快速排序,希尔排序等等,这些排序我将会在Java数据结构中进行讲解,希望大家关注!另外,算法的效率决定了程序员的能力,大家切忌只关注运行结果不关注算法效率。