尋找前k大的數

2021-06-27 08:25:11 字數 1477 閱讀 5680

input

輸入有多個測試用例,每個測試用例是兩行:

第1行是兩個整數n和k,中間用空格隔開(n ≥ k)

第2行有n個整數,每兩個數字中間用空格隔開

輸入以eof結束

output

對於每乙個測試用例,輸出一行,k個整數,就是它的前k大的整數,按照降序排列輸出,每兩個數字之間用空格隔開,最後乙個數字後面沒有空格,有換行。

sample input

5 2

3 2 4 1 5

sample output

5 4

思路:

1、建立前k個數的小根堆,堆頂為k個數中最小數

2、剩餘n - k個數用arr[i]表示,堆頂用maxarr[0]表示

3、如果maxarr[0] < arr[i],則maxarr[0] = arr[i],並重新建立小根堆,使得堆頂重新為最小數;

如果maxarr[0] >= arr[i],則i++,繼續比較

#include int arr[10001], n, k, count;

int maxarr[10001];

//小根堆排序

int minheap(int i)

int temp;

if (i % 2 == 0)

} else

} i -= 2;

} else

i--;

} cha += minheap(i);

return cha;

}//堆頂元素更改後重新建立小根堆

void chatop() else

} else if (2 * i + 1 >= k) else else

} else else

}} }

return;

}//刪除堆頂,並重新建立小根堆

void deltop(int max) else

} else if (2 * i + 1 >= max) else else

} else else

}} }

return;

}void print()

} std::cout << std::endl;

}int main()

} while (minheap(k - 1));

for (int i = k; i < n; i++)

} count = k - 1;

for (int i = 0; i < k; i++)

print();

} return 0;

}

前k大的數

取前 k 個數,並取出最小值 mi k min k,n 遍歷 第 k 1 n的數,與 mi k 比較。若小於 mi k 遍歷下乙個。若大於 mi k 放入該值,並移除mi k 後,再次取出最小值 mi k min k,n 時間複雜度 o n k 1.將資料分成三個區間 1 k 1,k m,m 1 n...

第k大的數,前k大的數

1 排序後去出前k個,o n log n 如果k2 o nlog k 快排把數分為了兩個部分,所以考慮兩個情況,如果大的部分的個數 k,說明只要繼續在大的部分找就可以了,如果大的部分的個數3 o nlog maxv minv delta 平均為o nlogn 轉化為找第k個,假設最大的數為maxv,...

尋找第K大的數

題目描述 要求在n個不重複的整數中,找出第k大的整數 其中0輸入第一行為兩個正整數n k 第二行為n個整數,輸入保證這n個整數兩兩相異,每個整數的範圍在 1000000到1000000之間 輸出輸出第k大的整數值 樣例輸入 5 33 2 4 5 1 樣例輸出 3 如下 include include...