668 k番目に小さい数で乗算テーブル
掛け算の九九を持つほとんどの人。しかし、あなたはすぐにk個の小さな数字は掛け算の表を行う見つけることができますか?
高さM、M * N Nの乗算テーブルの幅、及び正の整数kを考えると、あなたは、kのテーブル小さな数値を返す必要があります。
例 1:
入力:M = 3、N = 3 、K = 5
出力:3
説明:
乗算テーブル:
1 2 3
2 6 4
3 6 9
5 3人の少数(1、2、2、3、3)である。
実施例2:
入力:M = 2、N = 3 、K = 6
出力:6
説明:
乗算表:
1. 3 2
2 4 6
最初の数字は小さけれ6 6(1、2、2、3、4、6)。
注:
mおよびnは範囲[1、30000]の間です。
範囲内のK [1、M * N]の間です。
class Solution {
public int findKthNumber(int m, int n, int k) {
int left = 1, right = m*n;
while(left < right){
int mid = left + (right-left)/2;
if(counter(m, n, mid) >= k){
right = mid;
}else{
left = mid + 1;
}
}
return left;
}
public int counter(int m, int n, int mid) {
int x = m;
int y = 1;
int counter = 0;
while (x >= 1 && y <= n) {
if (x * y <= mid) {
counter += x;
y++;
} else {
x--;
}
}
return counter;
}
}