ধরুন আমরা একটি গুণের সারণী সম্পর্কে জানি। কিন্তু আমরা কি গুণ সারণী থেকে k-তম ক্ষুদ্রতম সংখ্যাটি দ্রুত বের করতে পারি? তাই যদি আমাদের একটি m * n গুণন সারণির উচ্চতা m এবং দৈর্ঘ্য n এবং একটি ধনাত্মক পূর্ণসংখ্যা k করতে হয়, তাহলে আমাদের এই টেবিলে k-তম ক্ষুদ্রতম সংখ্যাটি খুঁজে বের করতে হবে।
সুতরাং যদি m =3 এবং n =3 এবং k 6 হয়, তাহলে আউটপুট হবে 4., এর কারণ গুণন সারণী −
এর মত| | 1 | ৷2 | 3 |
| 1 | 1 | 2 | 3 |
| 2 | 2 | 4 | 6 |
| 3 | 3 | 6 | 9 |
6তম ক্ষুদ্রতম উপাদান হল 4 হিসাবে [1,2,2,3,3,4,6,6,9]
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- একটি ফাংশন ঠিক করুন(), এটি m, n, x, লাগবে
- ret :=0
- আরম্ভ করার জন্য i :=1, যখন i <=n, আপডেট করুন (i 1 দ্বারা বৃদ্ধি করুন), −
- করুন
- temp :=সর্বনিম্ন x / i এবং m
- ret :=ret + temp
- রিটার্ন রিটার্ন
- প্রধান পদ্ধতি থেকে, নিম্নলিখিতগুলি করুন -
- ret :=-1, low :=1, high :=m * n
- যখন কম <=বেশি, কর −
- মধ্য :=নিম্ন + (উচ্চ - নিম্ন) / 2
- cnt :=ঠিক আছে(m, n, mid)
- যদি cnt>=k হয়, তাহলে −
- উচ্চ :=মধ্য - 1
- ret :=mid
- অন্যথায়
- নিম্ন :=মধ্য + 1
- রিটার্ন রিটার্ন
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#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));
} ইনপুট
“2*”
আউটপুট
4