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

C++-এ লেক্সিকোগ্রাফিকাল অর্ডারে K-তম সবচেয়ে ছোট সংখ্যা

লেক্সিকোগ্রাফিকাল অর্ডার সমস্যা

দুটি মান n এবং k দেওয়া আছে। ১ থেকে n পর্যন্ত의 সকল পূর্ণসংখ্যাকে লেক্সিকোগ্রাফিকাল (শব্দকোষিক) ক্রমে সাজালে k-তম সংখ্যাটি কত?

উদাহরণ: n = 14, k = 3 হলে ক্রম হবে: [1, 10, 11, 12, 13, 14, 2, 3, 4, 5, 6, 7, 8, 9]। তাই ৩য় সংখ্যা হলো 11।

সমাধানের পদ্ধতি (প্রিফিক্স ট্রি / ট্রাই ওপ্টিমাইজেশন)

সभी সংখ্যা একটি ১০-শাখা ট্রাই-তে ভিজ্যুアライজ করা যায়। আমরা প্রিফিক্স ভিত্তিক স্টেপ গণনা করে k-তম উপাদান খুঁজে বের করি।

  • findKthNumber(n, k):
    • curr := 1, k--
    • while k > 0:
      • steps := calcSteps(n, curr, curr + 1)
      • যদি steps ≤ k: k -= steps; curr++ (বর্তমান প্রিফিক্স স্কিপ করুন)
      • অন্যথায়: curr *= 10; k-- (গভীরে যান)
    • curr ফেরত দিন
  • calcSteps(n, n1, n2): প্রিফিক্স n1 এবং n2 এর মধ্যে n-এর অধীনে কত সংখ্যা আছে তা গণনা করুন

C++ কোড উদাহরণ

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;

class Solution {
public:
    int findKthNumber(int n, int k) {
        int curr = 1;
        k--;
        while(k) {
            int steps = calcSteps(n, curr, curr + 1);
            if(steps <= k) {
                k -= steps;
                curr++;
            } else {
                curr *= 10;
                k -= 1;
            }
        }
        return curr;
    }
    
    int calcSteps(lli nax, lli n1, lli n2) {
        int ret = 0;
        while(n1 <= nax) {
            ret += min(nax + 1, n2) - n1;
            n1 *= 10;
            n2 *= 10;
        }
        return ret;
    }
};

int main() {
    Solution ob;
    cout << (ob.findKthNumber(14, 3));
    return 0;
}

ইনপুট

14,3

আউটপুট

11
  1. C++-এ BST-তে K-তম ক্ষুদ্রতম উপাদান খুঁজে বের করা (Order Statistics)

  2. দ্বিতীয় অ্যারের সব উপাদান একই ক্রমে থাকা ন্যূনতম সাবঅ্যারে (C++)

  3. C++-এ ভেক্টর ডিসেন্ডিং অর্ডারে সর্ট করা (Sorting a vector in descending order in C++)

  4. C++ প্রোগ্রাম: লেক্সিকোগ্রাফিক্যাল অর্ডারে এলিমেন্ট সর্ট করা