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

C++-এ লিমিটের নিচে অ্যাবসোলিউট ডিফারেন্স ওয়ালা লংগেস্ট সাবঅ্যারে


একটি ইন্টিজার অ্যারে nums এবং লিমিট limit দেওয়া আছে। সবচেয়ে বড় সাবঅ্যারে বের করতে হবে যেন সেটির যেকোনো দুটি এলিমেন্টের মধ্যে অ্যাবসোলিউট ডিফারেন্স limit এর চেয়ে কম বা সমান।

ইনপুট: nums = [8,2,4,7], limit = 4 → আউটপুট: 2 (সাবঅ্যারে [2,4] বা [4,7])

সমাধানের ধাপগুলো (স্লাইডিং উইন্ডো + ডিক):

  • দুটি ডিক maxD (নিম্নক্রম) ও minD (বর্ধমান ক্রম) মেইনটেইন করব

  • উইন্ডো প্রসারিত করব i দিয়ে

  • যখন maxD.front() - minD.front() > limit হয়, উইন্ডো ছোট করব j বাড়িয়ে

  • ret = max(ret, i - j + 1)

উদাহরণ

নিচের কোডটি দেখুন −

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

class Solution {
public:
    int longestSubarray(vector<int>& nums, int k) {
        int ret = 0;
        int j = 0;
        deque<int> maxD;
        deque<int> minD;
        int n = nums.size();
        for (int i = 0; i < n; i++) {
            while (!maxD.empty() && maxD.back() < nums[i])
                maxD.pop_back();
            while (!minD.empty() && minD.back() > nums[i])
                minD.pop_back();
            maxD.push_back(nums[i]);
            minD.push_back(nums[i]);
            while (maxD.front() - minD.front() > k) {
                if (nums[j] == maxD.front())
                    maxD.pop_front();
                if (nums[j] == minD.front())
                    minD.pop_front();
                j++;
            }
            ret = max(ret, i - j + 1);
        }
        return ret;
    }
};

int main() {
    Solution ob;
    vector<int> v = {7,8,2,4};
    cout << (ob.longestSubarray(v, 4));
}

ইনপুট

{7,8,2,4}, 4

আউটপুট

2

  1. C++-এ निरপেক্ষ পার্থক্য ১ বা তদন uglיף একটি অ্যারে থেকে সর্বোচ্চ উপাদান নির্বাচন

  2. C++-এ Y-র চেয়ে ছোট নম্বর দিয়ে মিনিমাম সেট বের করা

  3. C++ ব্যবহার করে n-র চেয়ে ছোট বা সমান সব ফ্যাক্টোরিয়াল নম্বর বের করা

  4. C++-এ LCM যা গুণফলের সমান হয় এমন সর্বোচ্চ দৈর্ঘ্যের সাবঅ্যারে