मान लीजिए कि हमारे पास एक पूर्णांक सरणी है, हमारा कार्य दिए गए सरणी के सभी अलग-अलग संभावित बढ़ते क्रमों को खोजना है, और बढ़ते क्रम की लंबाई कम से कम 2 होनी चाहिए। इसलिए यदि सरणी [4,6,7,7] की तरह है ], तो आउटपुट जैसा होगा - [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7 , 7], [7,7], [4,7,7]]।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- सभी परिणामों को संग्रहीत करने के लिए res नामक एक सरणी को परिभाषित करें
- हल नामक एक विधि बनाएं। यह अंक सरणी, प्रारंभ और अस्थायी सरणी लेगा
- यदि अस्थायी का आकार> 1 है, तो अस्थायी को रेस में डालें
- विज़िट नाम का एक सेट बनाएं
- के लिए मैं रेंज में अंकों के आकार के लिए शुरू करते हैं
- x :=nums[i]
- यदि x विज़िट किए गए सेट में है, तो लूप के अगले भाग को छोड़ दें
- विज़िट किए गए सेट में x डालें
- यदि अस्थायी खाली है या अस्थायी का अंतिम तत्व <=x है, तो
- अस्थायी में x डालें
- कॉल सॉल्व (अंक, i + 1, अस्थायी)
- अस्थायी के अंत से एक तत्व हटाएं
- मुख्य विधि से, कॉल हल करें(nums, 0, temp)
- रिटर्न रेस
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<vector<auto> > v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << "[";
for(int j = 0; j <v[i].size(); j++){
cout << v[i][j] << ", ";
}
cout << "],";
}
cout << "]"<<endl;
}
class Solution {
public:
vector < vector <int> > res;
void solve( vector <int>& nums, int start, vector <int> temp){
if(temp.size() > 1){
res.push_back(temp);
}
set <int> visited;
for(int i = start; i < nums.size(); i++){
int x = nums[i];
if(visited.count(x))continue;
visited.insert(x);
if(temp.empty() || temp[temp.size() - 1] <= x){
temp.push_back(x);
solve(nums, i + 1, temp);
temp.pop_back();
}
}
}
vector<vector<int>> findSubsequences(vector<int>& nums) {
res.clear();
vector <int> temp;
solve(nums, 0, temp);
return res;
}
};
main(){
vector<int> v = {5,6,7,8};
Solution ob;
print_vector(ob.findSubsequences(v));
} इनपुट
[4,6,7,8]
आउटपुट
[[5, 6, ],[5, 6, 7, ],[5, 6, 7, 8, ],[5, 6, 8, ],[5, 7, ],[5, 7, 8, ],[5, 8, ],[6, 7, ],[6, 7, 8, ],[6, 8, ],[7, 8, ],]