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

C++ में दिए गए नियमों के साथ तत्वों को हटाकर ऐरे का न्यूनतम संभव आकार ढूंढना

इस समस्या में, हमें n संख्याओं का एक ऐरे और एक पूर्णांक मान k दिया गया है। हमारा कार्य दिए गए नियमों के साथ तत्वों को हटाकर ऐरे का न्यूनतम संभव आकार ढूंढना है।

समस्या विवरण - हमें ऐरे में तत्वों की संख्या को न्यूनतम करना है। निम्नलिखित डिलीशन ऑपरेशन का उपयोग करके, एक बार में हटाए जा सकने वाले तत्वों की संख्या 3 है। डिलीशन संभव है यदि तीन तत्व दो दी गई शर्तों को पूरा करते हैं,

शर्त 1 - तीन तत्व आसन्न होने चाहिए।

शर्त 2 - दो आसन्न तत्वों के बीच का अंतर k है, यानी arr[i+1] = arr[i] + k और arr[i+2] = arr[i+1] + k।

समस्या को समझने के लिए एक उदाहरण लेते हैं,

इनपुट

{4, 6, 8, 4, 1, 5}, k = 2

आउटपुट

3

व्याख्या

इंडेक्स 0, 1, 2 के लिए एक डिलीशन ऑपरेशन संभव है।

समाधान दृष्टिकोण

यह समस्या हल करने के लिए थोड़ी मुश्किल है क्योंकि अप्रत्यक्ष डिलीशन ऑपरेशंस संभव हो सकते हैं जो एक डिलीशन ऑपरेशन के बाद देखे जा सकते हैं। उदाहरण के लिए, एक बार जब हम इंडेक्स 5, 6, 7 पर तत्वों को डिलीट करते हैं। इस डिलीशन के बाद, नई ऐरे में तत्व 3, 4, 5 हो सकते हैं जो अब डिलीशन के लिए शर्त को पूरा करते हैं। इस प्रकार की समस्याएं जिनमें ओवरलैपिंग सबप्रॉब्लम्स होते हैं, डायनामिक प्रोग्रामिंग दृष्टिकोण का उपयोग करके हल की जा सकती हैं। इसके लिए, हम सबप्रॉब्लम्स के परिणामों को स्टोर करने के लिए एक DP[][] मैट्रिक्स बनाए रखेंगे ताकि आवश्यकता पड़ने पर बाद में उन्हें एक्सेस किया जा सके, इसे मेमोइज़ेशन कहा जाता है।

हमारे समाधान के कार्य को दर्शाने वाला प्रोग्राम,

उदाहरण

#include <bits/stdc++.h>
using namespace std;

#define MAX 1000
int DP[MAX][MAX];

int calcMinSize(int arr[], int start, int end, int k) {
   if (DP[start][end] != -1)
      return DP[start][end];
   
   if ((end - start + 1) < 3)
      return end - start + 1;
   
   int minSize = 1 + calcMinSize(arr, start + 1, end, k);
   
   for (int i = start + 1; i <= end - 1; i++) {
      for (int j = i + 1; j <= end; j++) {
         if (arr[i] == (arr[start] + k) && arr[j] == (arr[start] + 2*k) 
             && calcMinSize(arr, start + 1, i - 1, k) == 0 
             && calcMinSize(arr, i + 1, j - 1, k) == 0) {
            minSize = min(minSize, calcMinSize(arr, j + 1, end, k));
         }
      }
   }
   return (DP[start][end] = minSize);
}

int main() {
   int arr[] = {4, 6, 8, 4, 1, 5};
   int n = sizeof(arr) / sizeof(arr[0]);
   int k = 2;
   memset(DP, -1, sizeof(DP));
   cout << "हटाने के बाद ऐरे का न्यूनतम संभव आकार है " << calcMinSize(arr, 0, n - 1, k);
   return 0;
}

आउटपुट

हटाने के बाद ऐरे का न्यूनतम संभव आकार है 3

एल्गोरिथ्म विश्लेषण

  • समय जटिलता: O(n³) - तीन नेस्टेड लूप्स के कारण
  • स्पेस जटिलता: O(n²) - DP टेबल के लिए
  • दृष्टिकोण: इंटरवल DP के साथ मेमोइज़ेशन
  • स्थिति: DP[l][r] = सबऐरे arr[l..r] का न्यूनतम आकार

मुख्य अवलोकन

डिलीशन के लिए तीन तत्वों को arithmetic progression बनाना होगा जिसमें कॉमन डिफरेंस k हो। डिलीशन के बाद, शेष भाग स्वतंत्र रूप से हल होते हैं।

  1. - C++ प्रोग्राम: सरणी में पहला, दूसरा और तीसरा न्यूनतम तत्व ज्ञात करना

    मान लें हमारे पास n तत्वों की एक सरणी है। हमें सरणी में पहला, दूसरा और तीसरा न्यूनतम तत्व ज्ञात करना है। पहला न्यूनतम सरणी का न्यूनतम है, दूसरा न्यूनतम न्यूनतम है लेकिन पहले से बड़ा, और इसी तरह तीसरा न्यूनतम न्यूनतम है लेकिन दूसरे न्यूनतम से बड़ा। प्रत्येक तत्व को स्कैन करें, फिर तत्व की जांच करें,

  1. - C++ में दिए गए सरणी के एलिमेंट्स के फैक्टोरियल का GCD खोजें

    मान लीजिए हमारे पास N एलिमेंट्स वाली एक सरणी A है। हमें सरणी के सभी एलिमेंट्स के फैक्टोरियल का GCD निकालना है। मान लीजिए एलिमेंट्स {3, 4, 8, 6} हैं, तो फैक्टोरियल का GCD 6 होगा। यहां हम ट्रिक देखेंगे। चूंकि दो संख्याओं का GCD वह सबसे बड़ी संख्या है जो दोनों को विभाजित करती है, तो दो संख्याओं के फैक्

  1. - C++ में अभाज्य आवृत्ति वाले एरे तत्व

    एरे (Array) समान डेटा प्रकार के तत्वों का एक कंटेनर है। अभाज्य आवृत्ति (Prime Frequencies) का अर्थ है कि एरे के तत्व की घटनाओं की संख्या एक अभाज्य संख्या है। इसलिए, इन परिभाषाओं के आधार पर समस्या अभाज्य आवृत्ति वाले एरे तत्वों को खोजने की है। हमें एक स्ट्रिंग/एरे दिया गया है। हमें वर्णों की आवृत्ति