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

C++ में सही अंतराल खोजें


मान लीजिए कि हमारे पास प्रत्येक अंतराल i के लिए अंतराल है, जांचें कि क्या कोई अंतराल j मौजूद है जिसका प्रारंभ बिंदु अंतराल i के समापन बिंदु से बड़ा या उसके बराबर है, जो कर सकता है कहा जा सकता है कि j, i के "दाईं ओर" है। किसी भी अंतराल i के लिए, हमें न्यूनतम अंतराल j के सूचकांक को संग्रहीत करना होगा, जो इंगित करता है कि अंतराल j में अंतराल i के लिए "सही" संबंध बनाने के लिए न्यूनतम प्रारंभ बिंदु है। जब अंतराल j मौजूद नहीं है, तो अंतराल i के लिए -1 स्टोर करें। और अंत में, हमें एक सरणी के रूप में प्रत्येक अंतराल के संग्रहीत मूल्य को आउटपुट करने की आवश्यकता होती है। तो अगर इनपुट [[3,4], [2,3], [1,2]] जैसा है, तो आउटपुट [-1, 0, 1] होगा, क्योंकि [3 के लिए ऐसा कोई सही अंतराल नहीं है। , 4], अंतराल [2,3] के लिए, अंतराल [3,4] में न्यूनतम- "दाएं" प्रारंभ बिंदु है; और [1,2] के लिए, अंतराल [2,3] में न्यूनतम-"दाएं" प्रारंभ बिंदु होता है।

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

  • n :=अंतराल सरणी का आकार, आकार n का am सरणी ret बनाएं, और इसे -1 का उपयोग करके भरें, m नामक मानचित्र बनाएं

  • मेरे लिए 0 से लेकर अंतराल के आकार तक

    • अगर अंतराल [i, 0] मी में है, तो अगले अंतराल पर जाएं

    • मी [अंतराल [i, 0]] :=i + 1

  • मैं के लिए n – 1 से नीचे की श्रेणी में>=0

    • it :=उस की-वैल्यू पेयर को इंगित करें जिसमें सबसे छोटी कुंजी है, लेकिन अंतराल से छोटी नहीं है [i, 1]

    • यदि इसका मान 0 है, तो अगले पुनरावृत्ति के लिए जाएं

    • ret[i] :=इसका मान – 1

  • वापसी रिट

उदाहरण (C++)

आइए एक बेहतर समझ प्राप्त करने के लिए निम्नलिखित कार्यान्वयन देखें -

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
public:
   vector<int> findRightInterval(vector<vector<int>>& intervals) {
      int n = intervals.size();
      vector <int> ret(n, -1);
      map <int, int< m;
      for(int i = 0; i < intervals.size(); i++){
         if(m.count(intervals[i][0])) continue;
         m[intervals[i][0]] = i + 1;
      }
      for(int i = n - 1; i >= 0; i--){
         map <int, int> :: iterator it = m.lower_bound(intervals[i][1]);
         if(it->second == 0) continue;
         ret[i] = it->second - 1;
      }
      return ret;
   }
};
main(){
   vector<vector<int>> v = {{3,4},{2,3},{1,2}};
   Solution ob;
   print_vector(ob.findRightInterval(v));
}

इनपुट

[[3,4],[2,3],[1,2]]

आउटपुट

[-1,0,1]

  1. C++ में त्रिभुज का परिमाप ज्ञात कीजिए

    इस समस्या में, हम एक त्रिभुज का परिमाप, विभिन्न प्रकार के त्रिभुजों के परिमाप का सूत्र और उन्हें खोजने का कार्यक्रम देखेंगे। परिधि आकृति के बारे में कुल दूरी के रूप में परिभाषित किया गया है। मूल रूप से, यह दी गई आकृति के सभी पक्षों का योग है। त्रिभुज का परिमाप त्रिभुज का परिमाप उसकी तीनों भुजाओं

  1. C++ में दी गई कुंजी का अगला दायां नोड खोजें

    इस समस्या में, हमें एक बाइनरी ट्री बीटी और एक प्रमुख मूल्य दिया जाता है। हमारा काम किसी दिए गए कुंजी का अगला दायां नोड ढूंढना है। बाइनरी ट्री एक विशेष डेटा संरचना है जिसका उपयोग डेटा संग्रहण उद्देश्यों के लिए किया जाता है। समस्या को समझने के लिए एक उदाहरण लेते हैं, इनपुट key = 4 आउटपुट 5 स्पष्ट

  1. C++ में डुप्लीकेट सबट्री खोजें

    मान लीजिए कि हमारे पास एक बाइनरी ट्री है। हमें सभी डुप्लिकेट सबट्री खोजने होंगे। इसलिए प्रत्येक प्रकार के डुप्लिकेट सबट्री के लिए, हमें उनमें से किसी एक का रूट नोड वापस करना होगा। तो मान लीजिए हमारे पास − . जैसा एक पेड़ है डुप्लीकेट सबट्री हैं - इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -