邓心一 4 jaren geleden
bovenliggende
commit
9a848ae0a5
1 gewijzigde bestanden met toevoegingen van 101 en 0 verwijderingen
  1. 101 0
      leetcode/hard/715.cc

+ 101 - 0
leetcode/hard/715.cc

@@ -0,0 +1,101 @@
+#include <algorithm>
+#include <vector>
+
+#include <iostream>
+
+using std::make_pair;
+using std::pair;
+using std::vector;
+
+using std::cout; using std::endl;
+
+class RangeModule {
+public:
+    RangeModule() {
+    }
+
+    void addRange(int left, int right) {
+        vector<pair<int, int> > result;
+        auto it = segments.begin();
+        for (; it != segments.end() && it->first < left; ++it);
+        segments.insert(it, make_pair(left, right));
+        for (it = segments.begin(); it != segments.end(); ++it) {
+            if (result.size() == 0 || result.back().second < it->first)
+                result.push_back(*it);
+            else
+                result.back().second = std::max(result.back().second, it->second);
+        }
+        segments = result;
+    }
+
+    bool queryRange(int left, int right) {
+        for (auto it = segments.begin(); it != segments.end() && left != right; ++it) {
+            if (it->second <= left || right <= it->first)
+                continue;
+            if (it->first <= left && right <= it->second)
+                return true;
+            if (left < it->first)
+                return false;
+            left = std::min(it->second, right);
+        }
+        return left == right;
+    }
+
+    void removeRange(int left, int right) {
+        vector<pair<int, int> > result;
+        for (auto it = segments.begin(); it != segments.end(); ++it) {
+            if (right <= it->first || it->second <= left) {
+                result.push_back(*it);
+                continue;
+            }
+            if (left <= it->first && it->second <= right)
+                continue;
+            if (it->first < left)
+                result.push_back(make_pair(it->first, left));
+            if (right < it->second)
+                result.push_back(make_pair(right, it->second));
+        }
+        segments = result;
+    }
+
+    void printRange() {
+        for (auto it = segments.begin(); it != segments.end(); ++it)
+            cout << it->first << ":" << it->second << "; ";
+        cout << endl;
+    }
+
+private:
+    vector<pair<int, int> > segments;
+};
+
+/**
+ * Your RangeModule object will be instantiated and called as such:
+ * RangeModule* obj = new RangeModule();
+ * obj->addRange(left,right);
+ * bool param_2 = obj->queryRange(left,right);
+ * obj->removeRange(left,right);
+ */
+
+// 0 < left < right < 10^9 in all calls to addRange, queryRange, removeRange
+// 1000000000
+
+int main() {
+    RangeModule *obj = new RangeModule();
+
+    obj->addRange(6, 8);
+    obj->removeRange(7, 8);
+    obj->removeRange(8, 9);
+    obj->addRange(8, 9);
+    obj->removeRange(1, 3);
+    obj->printRange();
+    obj->addRange(1, 8);
+
+    obj->printRange();
+    bool param_1 = obj->queryRange(2, 4) == true;
+    bool param_2 = obj->queryRange(2, 9) == true;
+    bool param_3 = obj->queryRange(4, 6) == true;
+
+    cout << param_1 << " " << param_2 << " " << param_3 << endl;
+
+    return 0;
+}