Java编程----时间效率02

本题主要考察的是数组和排序的结合,下面直入正题:
题目描述:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。


题目要求: 时间限制:1秒   空间限制:32768K


解题思路:

  1. 首先,看到题目之后,我们要查找数组中最小的K个数,就必须将K和数组的长度进行比较,只有数组的长度大于等于K,我们才能返回这K个数。
  2. 接着,我们怎样接受返回的K个数呢?我们就要定义一个数组,这个数组的长度为K。
  3. 准备工作就绪之后,我们就要开始思考怎么找到这最小的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数据结构中进行讲解,希望大家关注!另外,算法的效率决定了程序员的能力,大家切忌只关注运行结果不关注算法效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章