কম্পিউটার টিউটোরিয়াল

C++-এ অ্যারে বিভাজন ক্রমাগত সাবসিকোয়েন্সে


ধরুন আমাদের একটি nums অ্যারে আছে যা আরোহী ক্রমে সাজানো। আমাদের true ফেরত দিতে হবে যদি এবং কেবল যদি আমরা এটি ১ বা তার বেশি সাবসিকোয়েন্সে ভাগ করতে পারি যাতে প্রতিটি সাবসিকোয়েন্স ক্রমাগত পূর্ণসংখ্যাগুলি নিয়ে গঠিত হয় এবং যার দৈর্ঘ্য কমপক্ষে ৩। তাই যদি ইনপুট হয় [1,2,3,3,4,4,5,5], তবে আউটপুট হবে True, কারণ আমাদের দুটি ক্রমাগত সিকোয়েন্স রয়েছে। এগুলি হল [1,2,3,4,5] এবং [3,4,5]।

এটি সমাধান করতে আমরা নিম্নলিখিত ধাপগুলি অনুসরণ করব −

  • একটি ম্যাপ m তৈরি করুন এবং nums-এর ফ্রিকোয়েন্সি m-এ সংরক্ষণ করুন, nums-এর আকার n সংরক্ষণ করুন
  • cnt := n
  • i = 0 থেকে n – ১ পর্যন্ত
    • x := nums[i]
    • যদি m[x] এবং m[x + 1] এবং m[x + 2] হয়
    • m[x], m[x + 1] এবং m[x + 2] ১ হ্রাস করুন, x ৩ বৃদ্ধি করুন এবং count ৩ হ্রাস করুন
    • যখন m[x] > 0 এবং m[x] > m[x – ১]
      • cnt ১ হ্রাস করুন, m[x] ১ হ্রাস করুন এবং x ১ বৃদ্ধি করুন
  • যদি cnt ০ হয় তবে true ফেরত দিন, অন্যথায় false
  • বेहतर বোঝার জন্য নিচের ইমপ্লিমেন্টেশনটি দেখুন −

উদাহরণ

#include <bits/stdc++.h> using namespace std; class Solution {    public:    bool isPossible(vector<int>& nums) {       unordered_map <int, int> m;       int n = nums.size();       for(int i = 0; i < n; i++){          m[nums[i]]++;       }       int cnt = n;       for(int i = 0; i < n; i++){          int x = nums[i];          if(m[x] && m[x + 1] && m[x + 2]){             m[x]--;             m[x + 1]--;             m[x + 2]--;             x += 3;             cnt -= 3;             while(m[x] > 0 && m[x] > m[x - 1]){                cnt--;                m[x]--;                x++;             }          }       }       return cnt == 0;    } }; main(){    vector<int> v = {1,2,3,3,4,4,5,5};    Solution ob;    cout << (ob.isPossible(v)); }

ইনপুট

[1,2,3,3,4,4,5,5]

আউটপুট

1

  1. C++-এ অ্যারেকে সমান সম বিন্যাসে ভাগ করা দেওয়া শর্ত অনুযায়ী

  2. C++-এ স্ট্রিং এর অ্যারে (C++ Array of Strings)

  3. C++-এ সর্টিং (Sorting)

  4. C#-এ স্ট্রিংকে স্ট্রিং অ্যারের এলিমেন্টে ভাগ করা