ধরুন রিমার হাতে একটি কার্ড আছে, পূর্ণসংখ্যার অ্যারে হিসাবে দেওয়া হয়েছে। এখন তিনি কার্ডগুলিকে দলে ভাগ করতে চান যাতে প্রতিটি গ্রুপের আকার 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