কম্পিউটার

C++ এ সর্বোচ্চ সংখ্যা তৈরি করুন


ধরুন আমাদের দুটি সংখ্যার প্রতিনিধিত্বকারী 0-9 ডিজিট সহ m এবং n দৈর্ঘ্যের দুটি অ্যারে রয়েছে। আমাদের দুটির অঙ্ক থেকে m + n-এর চেয়ে কম দৈর্ঘ্য k এর সর্বাধিক সংখ্যা তৈরি করতে হবে। আমাদের মনে রাখতে হবে যে একই অ্যারে থেকে অঙ্কের আপেক্ষিক ক্রম সংরক্ষণ করতে হবে। আমাদের k সংখ্যার অ্যারে বের করতে হবে। সুতরাং যদি ইনপুটগুলি [3,4,7,5] এবং [9,1,3,5,8,4], এবং k =5 এর মত হয়, তাহলে উত্তর হবে [9,8,7,5,4 ]।

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • একটি ফাংশন mergeThem() সংজ্ঞায়িত করুন, এটি একটি অ্যারে সংখ্যা 1, একটি অ্যারে সংখ্যা2,
  • একটি অ্যারে ret সংজ্ঞায়িত করুন
  • i :=0, j :=0, n :=সংখ্যা 1 এর আকার, m :=সংখ্যা 2 এর আকার
  • যখন (i করুন
  • যদি বৃহত্তর ফাংশনটিকে কল করা হয় (সংখ্যা1, সংখ্যা2, i, j) সত্য হয়, তাহলে −
    • ret এর শেষে nums1[i] ঢোকান
    • (i 1 দ্বারা বাড়ান)
  • অন্যথায়
    • ret এর শেষে nums2[j] ঢোকান
    • (j 1 দ্বারা বাড়ান)
  • রিটার্ন রিটার্ন
  • একটি ফাংশন সংজ্ঞায়িত করুন modify(), এটি একটি অ্যারে নিয়ে যাবে v, k,
  • একটি স্ট্যাকের সংজ্ঞা দিন
  • একটি অ্যারে ret সংজ্ঞায়িত করুন
  • আরম্ভ করার জন্য i :=0, যখন i করুন
  • x :=v[i]
  • যখন (st খালি নয় এবং st এর উপরের উপাদান =k), করবেন −
    • st থেকে উপাদান মুছুন
  • যদি st
  • st-এ x ঢোকান
  • যখন (st খালি নয়), −
      করুন
    • ret এর শেষে st-এর শীর্ষ উপাদান সন্নিবেশ করুন
    • st থেকে উপাদান মুছুন
  • অ্যারে রিভার্স করুন
  • রিটার্ন রিটার্ন
  • একটি ফাংশন বৃহত্তর(), এটি একটি অ্যারে নেবে, একটি অ্যারে বি, i, j,
  • যখন (i করুন
  • i 1 দ্বারা বাড়ান এবং j 1 দ্বারা বাড়ান
  • সত্য প্রত্যাবর্তন যখন j ==b এর আকার বা i b[j]
  • প্রধান পদ্ধতি থেকে নিম্নলিখিতগুলি করুন:
  • একটি অ্যারে ret সংজ্ঞায়িত করুন
  • n :=সংখ্যা1 এর আকার
  • m :=সংখ্যা 2 এর আকার
  • আরম্ভ করার জন্য i :=0, যখন i <=k, আপডেট করুন (i 1 দ্বারা বাড়ান), −
      করুন
    • যদি i <=n এবং (k - i) <=m, তাহলে −
      • একটি অ্যারে প্রার্থীকে সংজ্ঞায়িত করুন =mergeThem(modify(nums1, i), modify(nums2, k - i))
      • যদি বড় (প্রার্থী, ret, 0, 0) সত্য হয়, তাহলে −
      • ret :=প্রার্থী
  • রিটার্ন রিটার্ন
  • আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -

    উদাহরণ

    #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> mergeThem(vector<int> nums1, vector<int> nums2)
       {
          vector<int> ret;
          int i = 0;
          int j = 0;
          int n = nums1.size();
          int m = nums2.size();
          while (i < n || j < m) {
             if (greater(nums1, nums2, i, j)) {
                ret.push_back(nums1[i]);
                i++;
             }
             else {
                ret.push_back(nums2[j]);
                j++;
             }
          }
          return ret;
       }
       vector<int> modify(vector<int>& v, int k)
       {
          stack<int> st;
          vector<int> ret;
          for (int i = 0; i < v.size(); i++) {
             int x = v[i];
             while (!st.empty() && st.top() < x && st.size() + (v.size() - i) - 1 >= k) {
                st.pop();
             }
             if (st.size() < k)
                st.push(x);
             }
             while (!st.empty()) {
                ret.push_back(st.top());
                st.pop();
             }
             reverse(ret.begin(), ret.end());
             return ret;
          }
          bool greater(vector<int>& a, vector<int>& b, int i, int j)
          {
             while (i < a.size() && j < b.size() && a[i] == b[j])
             i++, j++;
             return j == b.size() || (i < a.size() && a[i] > b[j]);
          }
          vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k)
          {
             vector<int> ret;
             int n = nums1.size();
             int m = nums2.size();
             for (int i = 0; i <= k; i++) {
                if (i <= n && (k - i) <= m) {
                   vector<int> candidate = mergeThem(modify(nums1, i), modify(nums2, k - i));
                   if (greater(candidate, ret, 0, 0)) {
                      ret = candidate;
                   }
                }
             }
             return ret;
         }
    };
    main() {
       Solution ob;
       vector<int> v = { 3, 4, 7, 5 }, v1 = { 9, 1, 3, 5, 8, 4 };
       print_vector(ob.maxNumber(v, v1, 5));
    }

    ইনপুট

    { 3, 4, 7, 5 }
    { 9, 1, 3, 5, 8, 4 }
    5

    আউটপুট

    [9, 8, 7, 5, 4, ]

    1. C++ এ মিতব্যয়ী নম্বর

    2. C++ পেন্টাটোপ নম্বর

    3. C++ পাথের দৈর্ঘ্য সর্বাধিক সংখ্যক বাঁক রয়েছে

    4. C++ এ দ্বিপক্ষীয় গ্রাফে প্রান্তের সর্বাধিক সংখ্যা