ধরুন আমাদের B নামক একটি ব্ল্যাকলিস্ট রয়েছে। এটি রেঞ্জ [0, N) থেকে অনন্য পূর্ণসংখ্যাগুলিকে ধারণ করছে, আমাদের পরিসর [0, N) থেকে একটি অভিন্ন র্যান্ডম পূর্ণসংখ্যা ফেরত দেওয়ার জন্য একটি ফাংশন সংজ্ঞায়িত করতে হবে যা B-তে নেই। আমরা চেষ্টা করব random() কমিয়ে এই ফাংশনটিকে আরও অপ্টিমাইজ করুন। ফাংশন কল। ধরুন ইনপুট অ্যারে
এর মতএটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
একটি মানচিত্র সংজ্ঞায়িত করুন
- আমরা N এবং অ্যারে v দিয়ে আরম্ভ করব।
- ইনিটালাইজ করার জন্য i :=0, যখন i <এর আকার v, আপডেট করুন (i 1 দ্বারা বাড়ান), −
- করুন
- যদি v[i]
- যদি v[i]
- M :=N – m এর আকার
- n :=v এর আকার
- আরম্ভ করার জন্য i :=0, যখন i
করুন - যদি v[i]
- N 1 দ্বারা হ্রাস করুন
- যখন N m এ থাকে, −
- করুন
- N 1 দ্বারা হ্রাস করুন
- m[v[i]] :=N
- যদি v[i]
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int M;
map <int,int> m;
Solution(int N, vector<int>& v) {
for(int i = 0; i < v.size(); i++){
if(v[i] < N) m[v[i]] = -1;
}
M = N - (int)(m.size());
int n = v.size();
for(int i = 0; i < v.size(); i++){
if(v[i] < M){
while(m.count(--N));
m[v[i]] = N;
}
}
}
int pick() {
int x = rand() % M;
return m.count(x)? m[x] : x;
}
};
main(){
vector<int> v = {2};
Solution ob(4,v);
cout << (ob.pick()) << endl;
cout << (ob.pick()) << endl;
cout << (ob.pick()) << endl;
} ইনপুট
Give N = 4 and array [2]
আউটপুট
1 1 0