12345678910111213141516171819202122232425262728293031 |
- func findKthNumber(m int, n int, k int) int {
- beg, end := 1, m*n
- for beg <= end {
- mid := beg + (end-beg)/2
- if rank(m, n, mid) < k {
- beg = mid + 1
- } else {
- end = mid - 1
- }
- }
- return beg
- }
- func rank(m, n, x int) (cnt int) {
- // Find the rank row by row.
- // Assume that x is in the ith row:
- // 1*i 2*i 3*i ... n*i, then
- // x/i is in row 1 2 3 ... n,
- // so x is the (x/i)th num.
- for i := 1; i <= m; i++ {
- cnt += minInt(n, x/i)
- }
- return cnt
- }
- func minInt(x, y int) int {
- if x < y {
- return x
- }
- return y
- }
|