B라는 블랙리스트가 있다고 가정합니다. 이것은 범위 [0, N)에서 고유한 정수를 저장하는 것이므로 B에 없는 범위 [0, N)에서 균일한 임의의 정수를 반환하는 함수를 정의해야 합니다. 우리는 다음을 시도할 것입니다. random()을 줄여 이 함수를 더 최적화합니다. 함수 호출. 입력 배열이 다음과 같다고 가정합니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
하나의 지도 정의
- N과 배열 v로 초기화하겠습니다.
- 초기화 i의 경우:=0, i
- v[i]
- v[i]
- N을 1 감소
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#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