Nearly everyone has used the Multiplication Table. The multiplication table of size m x n is an integer matrix mat where mat[i][j] == i * j
(1-indexed).
Given three integers m, n, and k, return thekthsmallest element in them x nmultiplication table.
The multiplication table is sorted in each row and column. To find the k-th smallest number, we can use binary search on the value range. For a candidate value x, count how many numbers in the table are ≤ x. If the count is at least k, x could be the answer.
classSolution {
public:int findKthNumber(int m, int n, int k) {
int l =1, r = m * n;
while (l < r) {
int mid = (l + r) /2, cnt =0;
for (int i =1; i <= m; ++i) cnt += min(mid / i, n);
if (cnt >= k) r = mid;
else l = mid +1;
}
return l;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
funcfindKthNumber(mint, nint, kint) int {
l, r:=1, m*nforl < r {
mid:= (l+r) /2cnt:=0fori:=1; i<=m; i++ {
cnt+= min(mid/i, n)
}
ifcnt>=k {
r = mid } else {
l = mid+1 }
}
returnl}
func min(a, bint) int { ifa < b { returna }; returnb }
1
2
3
4
5
6
7
8
9
10
11
12
classSolution {
publicintfindKthNumber(int m, int n, int k) {
int l = 1, r = m * n;
while (l < r) {
int mid = (l + r) / 2, cnt = 0;
for (int i = 1; i <= m; ++i) cnt += Math.min(mid / i, n);
if (cnt >= k) r = mid;
else l = mid + 1;
}
return l;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
classSolution {
funfindKthNumber(m: Int, n: Int, k: Int): Int {
var l = 1var r = m * n
while (l < r) {
val mid = (l + r) / 2var cnt = 0for (i in1..m) cnt += minOf(mid / i, n)
if (cnt >= k) r = mid else l = mid + 1 }
return l
}
}
1
2
3
4
5
6
7
8
9
10
11
classSolution:
deffindKthNumber(self, m: int, n: int, k: int) -> int:
l, r =1, m * n
while l < r:
mid = (l + r) //2 cnt = sum(min(mid // i, n) for i in range(1, m+1))
if cnt >= k:
r = mid
else:
l = mid +1return l
1
2
3
4
5
6
7
8
9
10
11
12
13
14
impl Solution {
pubfnfind_kth_number(m: i32, n: i32, k: i32) -> i32 {
let (mut l, mut r) = (1, m * n);
while l < r {
let mid = (l + r) /2;
letmut cnt =0;
for i in1..=m {
cnt += (mid / i).min(n);
}
if cnt >= k { r = mid; } else { l = mid +1; }
}
l
}
}