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

C++-এ সর্টেড রো মেট্রিক্স থেকে K-তম স্মলেস্ট সাম (Find Kth Smallest Sum of Matrix With Sorted Rows)


একটি m×n মেট্রিক্স mat দেওয়া আছে যেখানে প্রতিটি সারি সর্টেড। প্রতিটি সারি থেকে একটা করে উপাদান নিয়ে অ্যারে বানাতে হবে। সব সম্ভাব্য অ্যারেতের যোগফলের মধ্যে k-তম স্মলেস্ট যোগফল বের করুন।

উদাহরণ: mat = [[1,3,11],[2,4,6]], k=5 -> আউটপুট ৭। প্রথম ৫টি স্মলেস্ট সাম: [1,2],[1,4],[3,2],[3,4],[1,6]। ৫ম যোগফল ৭।

সমাধানের ধাপসমূহ

  • প্রায়োরিটি কিউ (min-heap) এবং ২D অ্যারে m ব্যবহার করুন।
  • update() ফাংশন: করেন্ট ইন্ডেক্স কম্বিনেশন থেকে পরের সম্ভাব্য কম্বিনেশন জেনারেট করে PQ-তে পুশ করুন।
  • প্রাথমিক যোগফল (প্রতিটি সারির প্রথম উপাদান) PQ-তে দিন।
  • k বার: PQ থেকে মিন বের করুন, সেটে ভিজিটেড مار্ক করুন, update() কল করুন।
  • শেষে রিটার্ন করা মানটি হবে k-তম স্মলেস্ট সাম।

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

#include <bits/stdc++.h>
using namespace std;

struct Cmp {
    bool operator()(vector<int>& a, vector<int>& b) {
        return !(a[0] < b[0]);
    }
};

class Solution {
public:
    priority_queue<vector<int>, vector<vector<int>>, Cmp> pq;
    vector<vector<int>> m;
    int z;
    void update(vector<int>& v, int i, bool ok = false) {
        if (i == v.size()) {
            if (!ok) return;
            int sum = 0;
            for (int j = 0; j < v.size(); j++) sum += m[j][v[j]];
            vector<int> temp(v.begin(), v.end());
            temp.insert(temp.begin(), sum);
            pq.push(temp);
            return;
        }
        v[i]++;
        if (!ok && v[i] < z) update(v, i+1, true);
        v[i]--;
        update(v, i+1, ok);
    }
    int kthSmallest(vector<vector<int>>& mat, int k) {
        this->m = mat;
        int ret = 0, n = m.size();
        z = m[0].size();
        for (int i = 0; i < n; i++) ret += m[i][0];
        vector<int> temp(n);
        temp.insert(temp.begin(), ret);
        pq.push(temp);
        set<vector<int>> s;
        while (k--) {
            vector<int> temp = pq.top(); pq.pop();
            s.insert(temp);
            ret = temp[0];
            temp.erase(temp.begin());
            update(temp, 0);
            while (!pq.empty() && s.count(pq.top())) pq.pop();
        }
        return ret;
    }
};

int main() {
    Solution ob;
    vector<vector<int>> v = {{1,3,11},{2,4,6}};
    cout << ob.kthSmallest(v, 5);
    return 0;
}

ইনপুট

{{1,3,11},{2,4,6}}

আউটপুট

7
  1. C++-এ থ্রেশহোল্ড দূরত্বে সবচেয়ে কম প্রতিবেশী город খুঁজে বের করা

  2. C++ প্রোগ্রাম: ম্যাট্রিক্সের প্রতিটি রো এবং কলামের যোগফল বের করা

  3. C++ ব্যবহার করে ম্যাট্রিক্সে সর্বোচ্চ যোগফল করা কলাম বের করা

  4. C++ প্রোগ্রাম: অ্যারে পার্টিশনিং মেথড দিয়ে kth সবচেয়ে ছোট এলিমেন্ট বের করা