@@ -44,43 +44,26 @@ class Solution {
44
44
class Solution2 {
45
45
public:
46
46
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
+
61
52
int pick () {
62
53
int index = rand () % n_;
63
- int left = 0 , right = intervals_ .size () - 1 ;
54
+ int left = 0 , right = blacklist_ .size () - 1 ;
64
55
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]) {
68
58
right = mid - 1 ;
69
59
} else {
70
60
left = mid + 1 ;
71
61
}
72
62
}
73
- Interval cur = intervals_[left];
74
- return cur.left + index - cur.accu_count ;
63
+ return index + left;
75
64
}
76
65
77
- private:
78
- struct Interval {
79
- int left;
80
- int right;
81
- int accu_count;
82
- };
83
-
66
+ private:
84
67
int n_;
85
- vector<Interval> intervals_ ;
68
+ vector<int > blacklist_ ;
86
69
};
0 commit comments