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數據結構中進行講解,希望大家關注!另外,算法的效率決定了程序員的能力,大家切忌只關注運行結果不關注算法效率。

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