一、問題描述
給定乙個陣列,陣列中的資料無序,在乙個陣列中找出其第k個最小的數,例如對於陣列x,x = ,則其第2個最小的數為2。
二、解題思路
本演算法跟快排的思想相似,首先在陣列中選取乙個數centre作為樞紐,將比centre小的數,放到centre的前面將比centre大的數,放到centre的後面。如果此時centre的位置剛好為k,則centre為第k個最小的數;如果此時centre的位置比k前,則第k個最小數一定在centre後面,遞迴地在其右邊尋找;如果此時centre的位置比k後,則第k個最小數一定在centre後面,遞迴地在其左邊尋找。
注意:centre的位置=其下標值+1,因為陣列中的第乙個元素的下標為0。
從上面的描述中,我們可以看到這個演算法運用了減治的方法求解。減治的思想與分治非常相似,同樣是在一次操作中,削減問題的規模,只是分治把每個子問題求解後,要合併每個子問題的解才能得到問題,而減治的方法,卻不用合併子問題的解,子問題的解,直接就是原問題的解。舉個例子來說,就像快排和二分查詢演算法,前者是分治,後者是減治。因為快排要等到所有的子陣列都排完序,原陣列才有序,而二分查詢卻不用,它每執行一次查詢,直接丟棄一半的陣列,而不用合併子問題的解。不過也有不少書,把他們都歸為分治法。
/*** 輸入n個整數,找出其中最小的k個整數,找出其中最小的k個數。
* 例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字為1,2,3,4
*/public
class
e30kleastnumbers
arr[left] = arr[right];
while
(left < right && arr[left] < result)
arr[right] = arr[left];
} arr[left] = result;
return
left;
} public
int getleastnumbers(
int input,
intk)
else
} for(
inti = 0;i
output[i] = input[i];
} return
output;
} public
static
void
main(string args);
e30kleastnumbers test = new
e30kleastnumbers();
int output=test.getleastnumbers(arr,
4);
for(
inti = 0;i
system.out.print(output[i]+","
);
} }
}
第K個最大的數
思路一 暴力破解,無序陣列排序,排完序之後找到第k個最大的數,排序方法有多種,但是無序陣列排序快排時間複雜度比較低是o nlogn 思路二 快速選擇 快速選擇是在快速排序的基礎上進行的優化,快速選擇是把找到的基準點與要找的第k個數的下標做比較,如果正好是第k個最大的數直接返回即可,如果是比基準點大則...
演算法 尋找第K個最大的數
解題思路 通過快速排序的思想方法,每次隨機獲取指定範圍內乙個樹的排序位置,然後根據這個位置,再重新指定範圍,直到這個位置索引滿足k。class solution else index part nums,left,right return nums k public intpart int nums...
找到第N個醜數
把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。找到第n個醜數 方法1 存放num之前所有元素是否是醜數的flag int getuglynumber solution in...