ধরুন রিমার হাতে একটি কার্ড আছে, পূর্ণসংখ্যার অ্যারে হিসাবে দেওয়া হয়েছে। এখন তিনি কার্ডগুলিকে দলে ভাগ করতে চান যাতে প্রতিটি গ্রুপের আকার W হয় এবং পরপর W কার্ড থাকে। এটা সম্ভব কি না তা আমাদের যাচাই করতে হবে।
সুতরাং যদি কার্ডগুলি [1,2,3,6,2,3,4,7,8] এবং W =3 হয়, তবে উত্তরটি সত্য হবে, কারণ সে তাদের [1,2,3] এর মতো পুনর্বিন্যাস করতে পারে। ,[2,3,4],[6,7,8]
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- একটি মানচিত্র m সংজ্ঞায়িত করুন, এবং প্রতিটি উপাদানের ফ্রিকোয়েন্সি হাতে m এ সংরক্ষণ করুন
- যদিও হাতের মাপ 0
- নয়
- পূর্ববর্তী :=0
- এটি :=m-তে প্রথম কী-মানের জোড়ার নির্দেশক
- আমি 0 থেকে W – 1
- পরিসরে
- যদিও এটির মান 0, এটি :=পরবর্তী জোড়ার দিকে নির্দেশ করে
- যদি i> 0 এবং এর কী - 1 =prev বা i =0, তারপর
- এর মান 1 কমিয়ে দিন
- পূর্ববর্তী :=এর কী
- অন্যথায় মিথ্যা ফেরত দিন
- এটি :=পরবর্তী জোড়ার দিকে নির্দেশ করুন
- n :=n – W
- সত্যে ফিরে আসুন।
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool isNStraightHand(vector<int>& hand, int W) {
map <int, int> m;
int n = hand.size();
if(n % W != 0) return false;
for(int i = 0; i < n; i++){
m[hand[i]]++;
}
while(n){
map <int, int> :: iterator it = m.begin();
int prev = 0;
for(int i = 0; i < W; i++){
while(it->second == 0) it++;
if((i > 0 && it->first - 1 == prev) || i == 0){
it->second--;
prev = it->first;
}else{
return false;
}
it++;
}
n -= W;
}
return true;
}
};
main(){
vector<int> v = {1,2,3,6,2,3,4,7,8};
Solution ob;
cout << (ob.isNStraightHand(v, 3));
} ইনপুট
[1,2,3,6,2,3,4,7,8] 3
আউটপুট
1