二分法求乘法表第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; }