मान लीजिए कि हमारे पास पूर्णांकों की एक क्रमबद्ध श्रेणी नहीं है। हमें सबसे लंबे समय तक बढ़ते क्रम की संख्या ज्ञात करनी है, इसलिए यदि इनपुट [1, 3, 5, 4, 7] जैसा है, तो आउटपुट 2 होगा, क्योंकि बढ़ते क्रम [1,3,5,7] हैं और [1, 3, 4, 7]
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- n :=संख्या सरणी का आकार, दो सरणियाँ len और cnt आकार n बनाएं, और उन्हें मान 1 से भरें।
- लिस:=1
- मैं के लिए 1 से n की सीमा में
- जे के लिए 0 से i - 1 की सीमा में
- यदि अंक[i]> अंक[j], तो
- अगर लेन[j] + 1> लेन[i], तो लेन[i] :=लेन[j] + 1, और cnt[i] :=cnt[j]
- अन्यथा जब लेन[j] + 1 =लेन[j], तब cnt[i] :=cnt[i] + cnt[j]
- लिस:=लिस और लेन की अधिकतम[j]
- यदि अंक[i]> अंक[j], तो
- जे के लिए 0 से i - 1 की सीमा में
- उत्तर:=0
- मैं के लिए 0 से n - 1 की सीमा में
- अगर लेन [i] =लिस, तो उत्तर:=उत्तर + सीएनटी [जे]
- वापसी उत्तर
उदाहरण(C++)
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int findNumberOfLIS(vector<int>& nums) {
int n = nums.size();
vector <int> len(n, 1), cnt(n, 1);
int lis = 1;
for(int i = 1; i < n; i++){
for(int j = 0; j < i; j++){
if(nums[i] > nums[j]){
if(len[j] + 1 > len[i]){
len[i] = len[j] + 1;
cnt[i] = cnt[j];
}
else if(len[j] + 1 == len[i]){
cnt[i] += cnt[j];
}
}
lis = max(lis, len[i]);
}
}
int ans = 0;
for(int i = 0; i < n; i++){
if(len[i] == lis)ans += cnt[i];
}
return ans;
}
};
main(){
Solution ob;
vector<int> v = {1,3,5,4,7};
cout << (ob.findNumberOfLIS(v));
} इनपुट
[1,3,5,4,7]
आउटपुट
2