কম্পিউটার টিউটোরিয়াল

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 := intervals array-এর সাইজ, সাইজ n-এর একটি ret অ্যারে তৈরি করুন এবং -1 দিয়ে ফিল করুন, একটি map m তৈরি করুন

  • i = 0 থেকে intervals-এর সাইজ পর্যন্ত লুপ চালান

    • যদি intervals[i, 0] m-এ থাকে, তবে পরবর্তী ইন্টারভালে যান

    • m[intervals[i, 0]] := i + 1

  • i = n – 1 থেকে i >= 0 পর্যন্ত লুপ চালান

    • it := সেই কি-ভ্যালু পয়েন্টার যেটির সবচেয়ে ছোট কি কিন্তু intervals[i, 1]-এর চেয়ে ছোট নয়

    • যদি it-এর ভ্যালু 0 হয়, তবে পরবর্তী ইটারেশনে যান

    • ret[i] := it-এর ভ্যালু – 1

  • ret রিটার্ন করুন

উদাহরণ (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++-এ

  2. সি++-এ ত্রিভুজের পেরিমিটার (Perimeter) বের করা

  3. বাইনারি ট্রিতে দেওয়া কীর নেক্সট রাইট নোড খুঁজে বের করা C++-এ

  4. C++-এ ডুপ্লিকেট সাবট্রি খুঁজে বের করা