ধরুন আমাদের কাছে nums নামে একটি সংখ্যার তালিকা আছে এবং আরেকটি সংখ্যা k, আমাদের পরীক্ষা করতে হবে যে তালিকাটি এমন তালিকায় বিভক্ত করা যেতে পারে যেখানে প্রতিটি তালিকায় k মান রয়েছে এবং মানগুলি ধারাবাহিকভাবে বৃদ্ধি পাচ্ছে।
সুতরাং, যদি ইনপুট nums =[4, 3, 2, 4, 5, 6], k =3 এর মত হয়, তাহলে আউটপুট হবে True, কারণ আমরা তালিকাটিকে [2, 3, 4] এবং [2, 3, 4] এ বিভক্ত করতে পারি। 4, 5, 6]
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
একটি মানচিত্র সংজ্ঞায়িত করুন
-
প্রতিটি কীর জন্য এটি m
এ-
m[এটি] 1 দ্বারা বৃদ্ধি করুন
-
-
ঠিক আছে :=সত্য
-
যখন (m-এর আকার 0 নয় এবং ঠিক আছে সত্য), −
করুন-
ঠিক আছে :=মিথ্যা
-
প্রতিটি কী-মানের জন্য এটি m
-এ যুক্ত করুন-
যদি (it.key - 1) m এ না থাকে, তাহলে −
-
পতাকা :=সত্য
-
আরম্ভ করার জন্য i :=it.key, যখন i <=it.key + k - 1, আপডেট (i 1 দ্বারা বৃদ্ধি), −
-
যদি আমি m এ উপস্থিত না থাকি, তাহলে −
-
পতাকা :=মিথ্যা
-
-
-
যদি পতাকা সত্য হয়, তাহলে -
-
আরম্ভ করার জন্য i :=it.key , যখন i <=it.key + k - 1, আপডেট (iby 1 বাড়ান), −
-
(1 দ্বারা m[i] হ্রাস করুন)
-
যদি m[i] 0 এর সমান হয়, তাহলে −
-
m
থেকে i মুছুন
-
-
-
ঠিক আছে :=সত্য
-
লুপ থেকে বেরিয়ে আসুন
-
-
-
-
-
m খালি হলে true ফেরত দিন, অন্যথায় মিথ্যা।
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#include<bits/stdc++.h>
using namespace std;
class Solution {
public:
bool solve(vector<int> nums, int k) {
map <int, int> m;
for(auto& it : nums){
m[it]++;
}
bool ok = true;
while(m.size() && ok){
ok = false;
for(auto& it : m){
if(!m.count(it.first - 1)){
bool flag = true;
for(int i = it.first; i <= it.first + k - 1;i++){
if(!m.count(i))
flag = false;
}
if(flag){
for(int i = it.first; i <= it.first + k - 1;i++){
m[i]--;
if(m[i] == 0)
m.erase(i);
}
ok = true;
break;
}
}
}
}
return m.empty();
}
};
main(){
vector<int> v = {4, 3, 2, 4, 5, 6};
Solution ob;
cout << ob.solve(v, 3);
}
ইনপুট
{4, 3, 2, 4, 5, 6} আউটপুট
1