二分法求乘法表第k大的数
给定高度m 、宽度n 的一张 m * n的乘法表,以及正整数k,返回表中第k大的数字。
例:输入: m = 3, n = 3, k = 4
输出: 4
解释:
乘法表:
1 2 3
2 4 6
3 6 9
从大到小排序为:9,6,6,4,3,3,2,2,1
第4大的数字是 4.
解题过程:
代码块
#include<iostream>
using namespace std;
int fun(int m, int n, int num) {//获得在m*n的乘法表中,找出有多少个值 >= num
int count = 0;
int temp;
for(int i = m; i>=1; --i) {
temp=(n-(num-1)/i);
if(temp<0){temp=0;}
count += temp;
}
return count;
}
int findKthMaxNumber(int m, int n, int k) {
if(k == 1) return m*n;
if(k == m*n) return 1;
int left = 1, right = m*n, mid;
while(left < right) {
mid = (left+right+1) >> 1;
int temp = fun(m, n, mid);
if(temp>=k) {
left = mid;
}
else {
right = mid-1;
}
}
return right;
}
int main(){
int m,n,k;
cin>>m>>n>>k;
int ans;
ans=findKthMaxNumber(m, n,k);
cout<<ans<<endl;
return 0;
}

查看8道真题和解析