मान लीजिए कि हमारे पास 0s और 1s की एक सरणी A है, हमें सरणी को 3 गैर-रिक्त भागों में विभाजित करना होगा जैसे कि ये सभी भाग समान बाइनरी मान का प्रतिनिधित्व करते हैं। यदि यह संभव है, तो किसी भी [i, j] को i+1
-
A[0], A[1], ..., A[i] पहला भाग है;
-
A[i+1], A[i+2], ..., A[j-1] दूसरा भाग है, और
-
A[j], A[j+1], ..., A[A.length - 1] तीसरा भाग है।
तीनों भागों का बाइनरी मान समान है। अगर यह संभव नहीं है, तो [-1, -1] वापस आएं।
इसलिए, यदि इनपुट [0,1,0,1,1] जैसा है, तो आउटपुट [0,4]
होगाइसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
फ़ंक्शन को परिभाषित करें getIdx(), यह एक सरणी लेगा a, बाएँ, दाएँ,
-
जबकि (बाएं <दाएं और एक [बाएं] 0 के समान है), करें -
-
(बाएं 1 से बढ़ाएं)
-
-
जबकि दाएं <(int)a.size(), करते हैं -
-
अगर एक [बाएं] एक [दाएं] के बराबर नहीं है, तो, वापसी -1
-
(बाएं से 1 बढ़ाएं), (1 से दाएं बढ़ाएं)
-
-
बाएं लौटें - 1
-
मुख्य विधि से निम्न कार्य करें -
-
आकार 2 के एक सरणी को परिभाषित करें इसे -1 से भरें
-
संख्या:=0, n:=A का आकार
-
इनिशियलाइज़ i:=0 के लिए, जब i
-
num :=num + 1 जब (A[i] 1 के समान हो, अन्यथा 0
-
-
अगर num mod 3 0 के बराबर नहीं है, तो -
-
वापसी रिट
-
-
यदि संख्या 0 के समान है, तो -
-
वापसी { 0, 2 }
-
-
अनुरोध :=संख्या / 3
-
आईडीएक्स :=n - 1
-
प्रारंभिक अस्थायी के लिए:=0, जब idx> =0 और अस्थायी
-
अस्थायी:=अस्थायी + 1 जब (ए [आईडीएक्स] 1 के समान है), अन्यथा 0
-
-
(आईडीएक्स को 1 से बढ़ाएं)
-
फर्स्टएंड :=getIdx(A, 0, idx)
-
अगर पहलेअंत <0, तो -
-
वापसी रिट
-
-
सेकेंडएंड :=getIdx(A, firstEnd + 1, idx)
-
अगर सेकेंडएंड <0, तो -
-
वापसी रिट
-
-
वापसी {फर्स्टएंड, सेकेंडएंड + 1}
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#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> threeEqualParts(vector<int>& A){ vector<int> ret(2, -1); int num = 0; int n = A.size(); for (int i = 0; i < n; i++) { num += (A[i] == 1); } if (num % 3 != 0) return ret; if (num == 0) { return { 0, 2 }; } int req = num / 3; int idx = n - 1; for (int temp = 0; idx >= 0 && temp < req; idx--) { temp += A[idx] == 1; } idx++; int firstEnd = getIdx(A, 0, idx); if (firstEnd < 0) return ret; int secondEnd = getIdx(A, firstEnd + 1, idx); if (secondEnd < 0) return ret; return { firstEnd, secondEnd + 1 }; } int getIdx(vector<int>& a, int left, int right){ while (left < right && a[left] == 0) left++; while (right < (int)a.size()) { if (a[left] != a[right]) return -1; left++; right++; } return left - 1; } }; main(){ Solution ob; vector<int> v = {0,1,0,1,1}; print_vector(ob.threeEqualParts(v)); }
इनपुट
{0,1,0,1,1}
आउटपुट
[1, 4, ]