Skip to content

Commit e0d1ffb

Browse files
authored
Update random-pick-with-blacklist.cpp
1 parent ddbd863 commit e0d1ffb

File tree

1 file changed

+11
-28
lines changed

1 file changed

+11
-28
lines changed

C++/random-pick-with-blacklist.cpp

Lines changed: 11 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -44,43 +44,26 @@ class Solution {
4444
class Solution2 {
4545
public:
4646
Solution(int N, vector<int> blacklist) :
47-
n_(N - blacklist.size()) {
48-
49-
sort(blacklist.begin(), blacklist.end());
50-
int prev = 0, count = 0;
51-
for (const auto& black : blacklist) {
52-
if (prev != black) {
53-
intervals_.push_back({prev, black, count});
54-
count += black - prev;
55-
}
56-
prev = black + 1;
57-
}
58-
intervals_.push_back({prev, N, count});
59-
}
60-
47+
n_(N - blacklist.size()),
48+
blacklist_(blacklist) {
49+
sort(blacklist_.begin(), blacklist_.end());
50+
}
51+
6152
int pick() {
6253
int index = rand() % n_;
63-
int left = 0, right = intervals_.size() - 1;
54+
int left = 0, right = blacklist_.size() - 1;
6455
while (left <= right) {
65-
int mid = left + (right - left) / 2;
66-
const auto& cur = intervals_[mid];
67-
if (index < cur.accu_count + cur.right - cur.left) {
56+
auto mid = left + (right - left) / 2;
57+
if (index + mid < blacklist_[mid]) {
6858
right = mid - 1;
6959
} else {
7060
left = mid + 1;
7161
}
7262
}
73-
Interval cur = intervals_[left];
74-
return cur.left + index - cur.accu_count;
63+
return index + left;
7564
}
7665

77-
private:
78-
struct Interval {
79-
int left;
80-
int right;
81-
int accu_count;
82-
};
83-
66+
private:
8467
int n_;
85-
vector<Interval> intervals_;
68+
vector<int> blacklist_;
8669
};

0 commit comments

Comments
 (0)