タイトル:入力nは整数、最小の数kを見つけます。4,5,1,6,2,7,3,8例えば8つのデジタル入力、最小数は4であり、1,2,3,4
溶液:O(N)アルゴリズムは、我々は、入力配列を変更することができる場合にのみ使用することができます
前の質問から、我々はこの問題を解決するために、我々はまた、パーティション関数に基づくことができ、触発することができます。k番目の数値より全ての数は、アレイの左側に配置されているように、番号のk番目の配列に基づいて調整した場合、最初のk個の数字よりも大きい全ての数値は、アレイの右側に配置されています。この調整で、アレイ内の左側に位置するK桁は、最小のk桁です。
public int partition(int[] arr, int left, int right) {
int result = arr[left];
if (left > right)
return -1;
while (left < right) {
while (left < right && arr[right] >= result) {
right--;
}
arr[left] = arr[right];
while (left < right && arr[left] < result) {
left++;
}
arr[right] = arr[left];
}
arr[left] = result;
return left;
}
public int[] getLeastNumbers(int[] input,int k){
if(input.length == 0 || k<= 0)
return null;
int[] output = new int[k];
int start = 0;
int end = input.length-1;
int index = partition(input,start,end);
while(index != k-1){
if(index > k-1){
end = index -1;
index = partition(input,start ,end);
}
else{
start = index+1;
index = partition(input,start ,end);
}
}
for(int i = 0;i<k;i++){
output[i] = input[i];
}
return output;
}
対処方法2:データのO(nlogk)アルゴリズムであり、特に好適なプロセス膨大な量
我々は、我々は、入力nは整数の番号から毎回読んで、最小の番号を保存するためにサイズk kのデータコンテナを作成することができます。あなたは既に直接整数にk個のコンテナよりも少ないデジタルがコンテナに読み込まれている場合、コンテナはk個の数字となっている場合、つまり、コンテナが満杯になった、そして我々はもはや新しい数字を挿入することはできませんしかし、既存の番号を交換します。これは、kの最大数を見つける必要があり、その後、整数との比較のために挿入される最大値をとります。最大電流に先立って挿入することよりも値が小さい場合、最大電流は、この番号によって置き換えられている、挿入される値は、従来の最大電流、最小可能数kより大きい場合整数の一つは、私たちは、この整数を放棄することができます。
このデータコンテナは、我々は簡単に最大ヒープを使用して考えることができます。最大スタックは、ルートノードの値は、サブツリー内の任意のノードの値よりも常に大きいです。それぞれ(1)は、k個の数字Oで得られた最大値を理解していることができ、我々はそうすることはO(logk)完全削除、および挿入操作を必要とします。
public void buildMaxHeap(int[] arr,int lastIndex){
for(int i = (lastIndex-1)/2;i>=0;i--){
int k = i;
while(2*k+1 <= lastIndex){
int biggerIndex = 2*k+1;
if(biggerIndex <lastIndex){
if(arr[biggerIndex]< arr[biggerIndex+1])
biggerIndex++;
}
if(arr[k] < arr[biggerIndex]){
swap(arr,k,biggerIndex);
k = biggerIndex;
}
else
break;
}
}
}
public static void swap(int[] arr,int i ,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public void heapSort(int[] arr){
for(int i = 0;i<arr.length-1;i++){
buildMaxHeap(arr,arr.length-i-1);
swap(arr,0,arr.length-i-1);
}
}
public void getLeastNumbers(int[] arr,int k){
if(arr == null || k<0 || k>arr.length)
return;
//根据输入数组前k个数简历最大堆
//从k+1个数开始与根节点比较
//大于根节点,舍去
//小于,取代根节点,重建最大堆
int[] kArray = Arrays.copyOfRange(arr, 0, k);
heapSort(kArray);
for(int i = k;i<arr.length;i++){
if(arr[i]<kArray[k-1]){
kArray[k-1] = arr[i];
heapSort(kArray);
}
}
for(int i:kArray)
System.out.print(i);
}