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

C++ में सबसे बड़ा विभाज्य उपसमुच्चय

मान लीजिए कि हमारे पास अलग-अलग सकारात्मक पूर्णांकों का एक सेट है, हमें सबसे बड़ा उपसमुच्चय ढूंढना है, जैसे कि इस उपसमुच्चय में तत्वों का प्रत्येक जोड़ा (Si, Sj) संतुष्ट करता है:Si mod Sj =0 या Sj mod Si =0।

इसलिए यदि इनपुट [1,2,3] जैसा है, तो संभावित परिणाम [1,2] या [1,3]

जैसा आ सकता है।

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

  • एक सरणी रिट बनाएं, एंडपॉइंट सेट करें:=0, रेटलेन:=1, एन:=अंकों का आकार

  • अगर n 0 है, तो खाली सेट लौटाएं

  • क्रमांक संख्या सरणी

  • दो सरणियाँ बनाएं लेन और आकार n के बराबर, लेन को 1 से प्रारंभ करें, और 0 के साथ बराबर करें

  • मैं के लिए 1 से n - 1 की सीमा में

    • पार[i] :=मैं

    • j के लिए 0 से i - 1 की सीमा में

      • यदि अंक [i] आधुनिक अंक [j] =0 और लेन [j] + 1> लेन [i], तो

        • लेन[i] :=लेन[j] + 1

        • पार[i] :=j

    • अगर लेन [j]> रिटलेन, फिर रेटलेन:=लेन [i] और एंडपॉइंट:=i

  • nums[endPoint] को रिट में डालें

  • जबकि एंडपॉइंट समान नहीं है par[endPoint]

    • समापन बिंदु:=बराबर [अंत बिंदु]

    • nums[endPoint] को रिट में डालें

  • सूची को उलट दें और वापस लौटें

उदाहरण(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> largestDivisibleSubset(vector<int>& nums) {
      vector <int> ret;
      int endPoint = 0;
      int retLen = 1;
      int n = nums.size();
      if(!n) return {};
      sort(nums.begin(), nums.end());
      vector <int> len(n, 1);
      vector <int> par(n, 0);
      for(int i = 1; i < n; i++){
         par[i] = i;
         for(int j = 0; j < i; j++){
            if(nums[i] % nums[j] == 0 && len[j] + 1 > len[i]){
               len[i] = len[j] + 1;
               par[i] = j;
            }
         }
         if(len[i] > retLen){
            retLen = len[i];
            endPoint = i;
         }
      }
      ret.push_back(nums[endPoint]);
      while(endPoint != par[endPoint]){
         endPoint = par[endPoint];
         ret.push_back(nums[endPoint]);
      }
      reverse(ret.begin(), ret.end());
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v = {1,2,3};
   print_vector(ob.largestDivisibleSubset(v));
}

इनपुट

[1,2,3]

आउटपुट

[1, 2, ]

  1. सी ++ में एक सरणी में विभाज्य जोड़े की गणना करें

    हमें पूर्णांक तत्वों वाले किसी भी आकार की एक सरणी दी गई है और कार्य एक सरणी में जोड़े की गणना की गणना करना है जैसे कि एक जोड़ी का एक तत्व एक जोड़ी के दूसरे तत्व को विभाजित करता है। एक प्रकार की डेटा संरचना को व्यवस्थित करता है जो एक ही प्रकार के तत्वों के एक निश्चित आकार के अनुक्रमिक संग्रह को संग्

  1. C++ में तीन से विभाज्य सबसे बड़ा योग

    मान लीजिए कि हमारे पास पूर्णांकों की एक सरणी संख्या है, हमें दिए गए सरणी के तत्वों का अधिकतम संभव योग इस तरह खोजने की आवश्यकता है कि यह तीन से विभाज्य हो। तो अगर इनपुट [3,6,5,1,8] जैसा है, तो आउटपुट 18 होगा, क्योंकि सबरे [3,6,1,8] है, और योग 18 है, जो 3 से विभाज्य है । इसे हल करने के लिए, हम इन चरण

  1. C++ में K से विभाज्य Subarray रकम

    मान लीजिए कि हमारे पास पूर्णांकों की एक सरणी A है। हमें सन्निहित गैर-रिक्त उप-सरणी की संख्या ज्ञात करनी है, जिसका योग k से विभाज्य है। यदि A =[4,5,0,-2,-3,1] और k =5, तो आउटपुट 7 होगा। सात उपसरणियाँ हैं। [[4,5,0,-2,-3,1], [5], [5,0],[5,0,-2,-3], [0], [0,-2,- 3], [-2,-3]] इसे हल करने के लिए, हम इन च