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

C++ में समान योग के साथ सरणी विभाजित करें


मान लीजिए हमारे पास n पूर्णांकों वाली एक सरणी है, हमें यह ढूंढना है कि क्या ट्रिपलेट्स (i, j, k) हैं जो इन शर्तों का पालन करते हैं:

  • 0 < i, i + 1 < j, j + 1 < k < n - 1
  • उपसरणियों (0, i - 1), (i + 1, j - 1), (j + 1, k - 1) और (k + 1, n - 1) का योग समान होगा।

उपसरणी (L, R) मूल सरणी का एक टुकड़ा है जो इंडेक्स L से शुरू होकर इंडेक्स R पर समाप्त होता है।

उदाहरण के लिए, यदि इनपुट [1,2,1,2,1,2,1] है, तो आउटपुट True होगा, क्योंकि i = 1, j = 3, k = 5।

sum(0, i - 1) = 1 sum(0, 0) = 1 sum(i + 1, j - 1) = 1 sum(2, 2) = 1 sum(j + 1, k - 1) = 1 sum(4, 4) = 1 sum(k + 1, n - 1) = 1 sum(6, 6) = 1

हल करने की विधि

हम प्रीफिक्स योग और सेट का उपयोग करेंगे:

  • n = nums का आकार।
  • प्रीफिक्स योग सरणी sums बनाएं।
  • j = 3 से n-1 तक लूप करें।
  • एक सेट s परिभाषित करें।
  • i = 1 से j-2 तक: sum1 = sums[i-1], sum2 = sums[j-1] - sums[i]। यदि sum1 == sum2, तो s में sum1 डालें।
  • k = j+2 से n-2 तक: sum1 = sums[k-1] - sums[j], sum2 = sums[n-1] - sums[k]। यदि sum1 == sum2 और sum1 s में है, तो true लौटाएं।
  • false लौटाएं।

उदाहरण

बेहतर समझ के लिए निम्न कार्यान्वयन देखें:

#include <bits/stdc++.h> using namespace std; class Solution { public:    bool splitArray(vector<int>& nums) {       int n = nums.size();       vector<int> sums(n);       sums[0] = nums[0];       for (int i = 1; i < n; i++) {          sums[i] += (nums[i] + sums[i - 1]);       }       for (int j = 3; j < n; j++) {          set<int> s;          for (int i = 1; i < j - 1; i++) {             int sum1 = sums[i - 1];             int sum2 = sums[j - 1] - sums[i];             if (sum1 == sum2)                s.insert(sum1);          }          for (int k = j + 2; k < n - 1; k++) {             int sum1 = sums[k - 1] - sums[j];             int sum2 = sums[n - 1] - sums[k];             if (sum1 == sum2 && s.count(sum1))                return true;             }          }          return false;       } }; main(){    Solution ob;    vector<int> v = {1,2,1,2,1,2,1};    cout << (ob.splitArray(v)); }

इनपुट

{1,2,1,2,1,2,1}

आउटपुट

1

  1. - C++ में निरपेक्ष अंतर के न्यूनतम योग वाला एरे तत्व

    यह प्रोग्राम दिए गए एरे के न्यूनतम निरपेक्ष अंतर को खोजने के लिए है जहां हमारे पास एक एरे है जिसमें विशिष्ट तत्व हैं। इस अवधारणा को बेहतर ढंग से सीखने के लिए, आइए आवश्यक चीजों को दोहराएं: एरे (Array) समान डेटा प्रकार के तत्वों का एक कंटेनर है। एरे की लंबाई पूर्वनिर्धारित होनी चाहिए। निरपेक्ष अंतर (

  1. - C++ सम एरे पहेली (Sum Array Puzzle)

    एरे (Array) एक डेटा संरचना है जो समान डेटा प्रकार के कई तत्वों को संग्रहीत करती है। यह एक बार में मानों का पूरा सेट संग्रहीत कर सकता है। लेकिन इसकी लंबाई पहले से परिभाषित होनी चाहिए। इस सम एरे पहेली में, हमें एक निश्चित आकार का एरे A1 दिया जाता है, मान लीजिए n। इस पहेली को हल करने के लिए, हम S1 नाम

  1. - C++ में सम ऐरे पजल (बिना घटाव ऑपरेटर के)

    यहां हम ऐरे से संबंधित एक रोचक समस्या देखेंगे। n तत्वों वाला एक ऐरे है। हमें n तत्वों का एक और ऐरे बनाना है। लेकिन दूसरे ऐरे का i-th स्थान पहले ऐरे के i-th तत्व को छोड़कर सभी तत्वों का योग रखेगा। और एक प्रतिबंध है कि हम इस समस्या में घटाव ऑपरेटर का उपयोग नहीं कर सकते। यदि हम घटाव ऑपरेशन का उपयोग कर