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