本題主要考察的是數組和排序的結合,下面直入正題:
題目描述:輸入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資料結構中進行講解,希望大家關注。另外,演算法的效率決定了程式員的能力,大家切忌只關注運行結果不關注演算法效率。