Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में इंटरवल हटाएं


मान लीजिए हमारे पास डिस्जॉइंट इंटरवल्स की एक सॉर्टेड सूची है, प्रत्येक इंटरवल intervals[i] = [a, b] उन संख्याओं x के सेट को दर्शाता है जैसे कि a <= x < b। हमें intervals में किसी भी इंटरवल और toBeRemoved इंटरवल के बीच के इंटरसेक्शन को हटाना है। अंत में, हमें ऐसे सभी हटाने के बाद इंटरवल्स की सॉर्टेड सूची ढूंढनी है। यदि इनपुट इस प्रकार है - [[0,2], [3,4],[5,7]], और toBeRemoved := [1, 6], तो आउटपुट [[0, 2], [6,7]] होगा।

इसे हल करने के लिए, हम निम्नलिखित चरणों का पालन करेंगे -

  • manipulate2() नामक एक मेथड परिभाषित करें, जो मैट्रिक्स a और एक ऐरे y लेगा
  • x := मैट्रिक्स a की अंतिम पंक्ति, फिर a से अंतिम पंक्ति डिलीट करें
  • z := x
  • x[0] := y[1], z[1] := y[0]
  • यदि z[0] - z[1], तो z को a में डालें
  • यदि x[0] - x[1], तो x को a में डालें
  • मेन मेथड मैट्रिक्स in और एक ऐरे t लेगा
  • ans नामक एक मैट्रिक्स परिभाषित करें, और n := मैट्रिक्स in में पंक्तियों की संख्या
  • i के लिए 0 से n - 1 तक की रेंज में
    • in[i] को ans में डालें
    • a := a की अंतिम पंक्ति, b := t
    • यदि a[0] > b[0], तो a और b को स्वैप करें
    • यदि a और b इंटरसेक्ट कर रहे हैं, तो manipulate2(ans, t) कॉल करें
  • ans लौटाएं

उदाहरण (C++)

बेहतर समझ के लिए निम्नलिखित इम्प्लीमेंटेशन देखें -

#include <bits/stdc++.h> using namespace std; void print_vector(vector<vector<auto> > v){    cout << "[";    for(int i = 0; i<v.size(); i++){       cout << "[";       for(int j = 0; j <v[i].size(); j++){          cout << v[i][j] << ", ";       }       cout << "],";    }    cout << "]"<<endl; } class Solution { public:    bool isIntersect(vector <int> a, vector <int> b){       return max(a[0], a[1]) >= min(b[0], b[1]);    }    void manipulate2(vector < vector <int> > &a, vector <int> y){       vector <int> x = a.back();       a.pop_back();       vector <int> z = x;       x[0] = y[1];       z[1] = y[0];       if(z[0] < z[1])a.push_back(z);       if(x[0] < x[1])a.push_back(x);    }    vector<vector<int>> removeInterval(vector<vector<int>>& in, vector<int>& t) {       vector < vector <int> > ans;       int n = in.size();       for(int i = 0; i < n; i++){          ans.push_back(in[i]);          vector <int> a;          vector <int> b;          a = ans.back();          b = t;          if(a[0]>b[0])swap(a, b);          if(isIntersect(a, b)){             manipulate2(ans, t);          }       }       return ans;    } }; main(){    vector<int> v2 = {1,6};    vector<vector<int>> v1 = {{0,2},{3,4},{5,7}};    Solution ob;    print_vector(ob.removeInterval(v1, v2)); }

इनपुट

[[0,2],[3,4],[5,7]] [1,6]

आउटपुट

[[0, 1, ],[6, 7, ],]

  1. - C++ में वेक्टर को कंस्ट्रक्टर में पास करना

    यह वेक्टर को कंस्ट्रक्टर में पास करने के लिए एक सरल C++ प्रोग्राम है। एल्गोरिथम Begin    Declare a class named as vector.       Declare vec of vector type.       Declare a constructor of vector class.          Pass a vector object v a

  1. - C++ में vector::resize() और vector::reserve() का अंतर

    वेक्टर में डायनामिक ऐरे की तरह खुद को ऑटोमैटिकली रीसाइज़ करने की क्षमता होती है। जब कोई एलिमेंट डाला या हटाया जाता है, तो कंटेनर अपने स्टोरेज को ऑटोमैटिकली संभालता है। vector::resize() और vector::reserve() के बीच मुख्य अंतर यह है कि resize() वेक्टर का साइज़ बदलने के लिए उपयोग किया जाता है जबकि rese

  1. - C++ में टाइप इन्फरेंस (प्रकार निगमन)

    टाइप इन्फरेंस या डिडक्शन का अर्थ है प्रोग्रामिंग भाषा में एक एक्सप्रेशन के डेटा टाइप का ऑटोमैटिक डिटेक्शन। यह कुछ स्ट्रॉन्गली स्टैटिकली टाइप्ड भाषाओं में मौजूद एक विशेषता है। C++ में, auto कीवर्ड (C++11 में जोड़ा गया) ऑटोमैटिक टाइप डिडक्शन के लिए उपयोग किया जाता है। उदाहरण के लिए, आप एक वेक्टर पर पु