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

C++ में k से अधिक योग वाले सबसे बड़े उप-सरणी

इस ट्यूटोरियल में, हम एक प्रोग्राम लिखने जा रहे हैं जिसमें सबसे बड़े सबअरे का योग k से अधिक होता है।

आइए समस्या को हल करने के लिए चरणों को देखें।

  • सरणी प्रारंभ करें।
  • सरणी पर पुनरावृति करें और अनुक्रमणिका के साथ वेक्टर में प्रत्येक अनुक्रमणिका पर योग संग्रहीत करें।
  • उपरोक्त राशियों को योग और अनुक्रमणिका के आधार पर क्रमबद्ध करें।
  • इंडेक्स को स्टोर करने के लिए ऐरे को इनिशियलाइज़ करें।
  • एक लूप लिखें जो n तक पुनरावृत्त हो।
    • उपरोक्त अनुक्रमणिका सरणी के न्यूनतम अनुक्रमणिका और पिछले योग सरणी अनुक्रमणिका वाले मानों को अद्यतन करें।
  • योग को 0 से प्रारंभ करें।
  • एक लूप लिखें जो n तक पुनरावृत्त हो।
    • योग में वर्तमान तत्व जोड़ें।
    • यदि योग k से अधिक है।
      • अधिकतम उपसरणी लंबाई i + 1 है।
    • अन्यथा अधिकतम उपसरणी लंबाई है
      • बाइनरी खोज का उपयोग करके पिछले योगों से अनुक्रमणिका खोजें।
      • योग जो योग - k - 1 से कम है, वह तत्व सूचकांक है जो हम चाहते हैं।

उदाहरण

आइए कोड देखें।

#include <bits/stdc++.h>
using namespace std;
bool compare(const pair<int, int>& a, const pair<int, int>& b) {
   if (a.first == b.first) {
      return a.second < b.second;
   }
   return a.first < b.first;
}
int findIndex(vector<pair<int, int> >& previousSums, int n, int val) {
   int start = 0;
   int end = n - 1;
   int mid, result = -1;
   while (start <= end) {
      mid = (start + end) / 2;
      if (previousSums[mid].first <= val) {
         result = mid;
         start = mid + 1;
      }else {
         end = mid - 1;
      }
   }
   return result;
}
int getLargestSubArray(int arr[], int n, int k) {
   int maxLength = 0;
   vector<pair<int, int> > previousSums;
   int sum = 0, minIndexes[n];
   for (int i = 0; i < n; i++) {
      sum = sum + arr[i];
      previousSums.push_back({ sum, i });
   }
   sort(previousSums.begin(), previousSums.end(), compare);
   minIndexes[0] = previousSums[0].second;
   for (int i = 1; i < n; i++) {
      minIndexes[i] = min(minIndexes[i - 1], previousSums[i].second);
   }
   sum = 0;
   for (int i = 0; i < n; i++) {
      sum = sum + arr[i];
      if (sum > k) {
         maxLength = i + 1;
      }else {
         int ind = findIndex(previousSums, n, sum - k - 1);
         if (ind != -1 && minIndexes[ind] < i) {
            maxLength = max(maxLength, i - minIndexes[ind]);
         }
      }
   }
   return maxLength;
}
int main() {
   int arr[] = { 5, 3, -3, 2, 4, 7 };
   int k = 5, n = 6;
   cout << getLargestSubArray(arr, n, k) << endl;
   return 0;
}

आउटपुट

यदि आप उपरोक्त कोड चलाते हैं, तो आपको निम्न परिणाम प्राप्त होंगे।

6

निष्कर्ष

यदि ट्यूटोरियल में आपके कोई प्रश्न हैं, तो उनका टिप्पणी अनुभाग में उल्लेख करें।


  1. C++ में दी गई राशि से कम या उसके बराबर राशि वाले अधिकतम योग उप-सरणी

    इस समस्या में, हमें एक सरणी और एक योग दिया जाता है। हमारा काम एक ऐसा प्रोग्राम बनाना है जो c++ में दिए गए योगों से कम या उसके बराबर राशि वाले अधिकतम योग उप-सरणी को खोजेगा। हमें n से कम या उसके बराबर किसी भी लंबाई का उप-सरणी ज्ञात करना है जिसका योग दिए गए योग से कम या उसके बराबर है। समस्या को समझने

  1. सी++ में अधिकतम सबरे योग मॉड्यूलो एम

    इस समस्या में, हमें n आकार की एक सरणी और एक पूर्णांक m दिया जाता है। हमारा काम एक ऐसा प्रोग्राम बनाना है जो C++ में अधिकतम सबअरे योग मॉड्यूल m ढूंढेगा। कार्यक्रम विवरण - यहां, हम सबएरे के सभी तत्वों के योग को m से विभाजित करके प्राप्त अधिकतम मान प्राप्त करेंगे। समस्या को समझने के लिए एक उदाहरण लेत

  1. C++ में उपसर्ग योग का उपयोग करते हुए O(n) में अधिकतम सबअरे योग

    समस्या कथन सकारात्मक और नकारात्मक पूर्णांकों की एक सरणी को देखते हुए, उस सरणी में अधिकतम सबअरे योग ज्ञात करें उदाहरण यदि इनपुट ऐरे − {-12, -5, 4, -1, -7, 1, 8, -3} है तो आउटपुट 9 है एल्गोरिदम इनपुट सरणी के उपसर्ग योग की गणना करें। प्रारंभ करें− min_prefix_sum =0, रेस =-अनंत i =0 से n के ल