邓心一 преди 4 години
родител
ревизия
8886a8cbb4
променени са 1 файла, в които са добавени 95 реда и са изтрити 0 реда
  1. 95 0
      leetcode/hard/710.cc

+ 95 - 0
leetcode/hard/710.cc

@@ -0,0 +1,95 @@
+#include <algorithm>
+#include <cstdlib>
+#include <ctime>
+#include <set>
+#include <vector>
+
+#include <iostream>
+
+using std::set;
+using std::vector;
+using std::sort;
+
+using std::cout; using std::endl;
+
+class Solution {
+private:
+    const int N;
+    const int MAX;
+    vector<int>& ban;
+    set<int> ban_set;
+
+    int random() {
+        return rand() % MAX;
+    }
+
+    int search_offset(int n) {
+        int beg = -1, end = ban.size() - 1;
+        while (end - beg > 1) {
+            int mid = beg + (end - beg) / 2;
+            if (ban.at(mid) < n) {
+                beg = mid;
+            } else {
+                end = mid;
+            }
+        }
+        return n < ban.at(end) ? end : end + 1;
+    }
+public:
+    Solution(int N, vector<int>& blacklist) : N(N), MAX(N - blacklist.size()), ban(blacklist), ban_set(set<int>(blacklist.begin(), blacklist.end())) {
+        srand(time(0));
+        sort(ban.begin(), ban.end());
+    }
+
+    int pick() {
+        int r = random();
+        if (N == MAX) {
+            return r;
+        }
+        // Binary search candidates from 0 to N - 1
+        int beg = 0, end = N - 1;
+        while(beg <= end) {
+            int mid = beg + (end - beg) / 2;
+            // To judge candidate is available or not:
+            // 1. Not banned; 2. Offset is correct
+            int rr = mid - search_offset(mid);
+            if (rr < r) {
+                beg = mid + 1;
+            } else if (r < rr) {
+                end = mid - 1;
+            } else {
+                if (ban_set.find(mid) == ban_set.end()) {
+                    return mid;
+                } else {
+                    end = mid - 1;
+                }
+            }
+        }
+        return -1;
+    }
+};
+
+/**
+ * Your Solution object will be instantiated and called as such:
+ * Solution* obj = new Solution(N, blacklist);
+ * int param_1 = obj->pick();
+ */
+
+// 0 1 2 3
+//     2
+// 0 4 5
+
+int main() {
+    int N = 4;
+    vector<int> blacklist;
+    blacklist.push_back(2);
+
+    Solution* obj = new Solution(N, blacklist);
+    int param_1 = obj->pick();
+    int param_2 = obj->pick();
+    int param_3 = obj->pick();
+
+    cout << param_1 << ", " << param_2 << ", " << param_3 << endl;
+
+    return 0;
+}