Giả sử chúng ta biết về một Bảng Nhân. Nhưng liệu chúng ta có thể tìm ra số nhỏ thứ k một cách nhanh chóng từ bảng cửu chương không? Vì vậy, nếu chúng ta có chiều cao m và chiều dài n của một Bảng nhân m * n và một số nguyên dương k, chúng ta phải tìm số nhỏ nhất thứ k trong bảng này.
Vì vậy, nếu m =3 và n =3 và k là 6, thì kết quả sẽ là 4., điều này là do bảng cửu chương giống như -
| | 1 | 2 | 3 |
| 1 | 1 | 2 | 3 |
| 2 | 2 | 4 | 6 |
| 3 | 3 | 6 | 9 |
Phần tử nhỏ thứ 6 là 4 as [1,2,2,3,3,4,6,6,9]
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- Xác định một hàm ok (), điều này sẽ lấy m, n, x,
- ret:=0
- để khởi tạo i:=1, khi i <=n, cập nhật (tăng i lên 1), thực hiện -
- temp:=tối thiểu là x / i và m
- ret:=ret + temp
- trả lời lại
- Từ phương pháp chính, hãy thực hiện như sau -
- ret:=-1, low:=1, high:=m * n
- while low <=high, do -
- giữa:=low + (cao - thấp) / 2
- cnt:=ok (m, n, mid)
- nếu cnt> =k, thì -
- cao:=giữa - 1
- ret:=mid
- Mặt khác
- thấp:=giữa + 1
- trả lời lại
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int ok(int m, int n, int x){
int ret = 0;
for(int i = 1; i <= n; i++){
int temp = min(x / i, m);
ret += temp;
}
return ret;
}
int findKthNumber(int m, int n, int k) {
int ret = -1;
int low = 1;
int high = m * n ;
while(low <= high){
int mid = low + (high - low)/ 2;
int cnt = ok(m, n, mid);
if(cnt >= k){
high = mid - 1;
ret = mid;
}else low = mid + 1;
}
return ret;
}
};
main(){
Solution ob;
cout << (ob.findKthNumber(3,3,6));
} Đầu vào
“2*”
Đầu ra
4