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

Python-এ সর্বোচ্চ সাবঅ্যারে মিন-প্রোডাক্ট বের করার প্রোগ্রাম


মনে করুন nums নামে একটি অ্যারে আছে, আমাদের nums-এর প্রতিটি নন-এম্পটি সাবঅ্যারের সর্বোচ্চ মিন-প্রোডাক্ট বের করতে হবে। যেহেতু উত্তর বড় হতে পারে, মডুলো 10^9+7-এ রিটার্ন করুন। একটি অ্যারের মিন-প্রোডাক্ট হল অ্যারেতে ন্যূনতম মান গুণ অ্যারেতে সব মানের যোগফল। তাই যদি অ্যারে [4,3,6] হয় (ন্যূনতম মান ৩) তবে এর মিন-প্রোডাক্ট 3*(4+3+6) = 3*13 = 39।

সুতরাং, যদি ইনপুট হয় nums = [2,3,4,3], তবে আউটপুট হবে 30 কারণ আমরা সাবঅ্যারে [3,4,3] নিতে পারি ফলাফল সর্বোচ্চ করার জন্য, তাই 3*(3+4+3) = 3*10 = 30।

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

  • m := 10^9+7

  • stack := একটি নতুন স্ট্যাক

  • rsum := 0, res := 0

  • nums-এর শেষে 0 ইনসার্ট করুন

  • nums-এ প্রতিটি ইন্ডেক্স i এবং মান v-এর জন্য, করুন

    • যতক্ষণ stack খালি নয় এবং nums[stack-এর টপের ইন্ডেক্স] >= v, করুন

      • (index, val) := stack-এর টপ এবং এটি পপ করুন

      • arrSum := rsum

      • যদি stack খালি নয়, তবে

        • arrSum := rsum - stack-এর টপের ভ্যালু

      • res := res এবং (nums[index]*arrSum) এর মধ্যে সর্বোচ্চ

    • rsum := rsum + v

    • stack-এর শেষে (i, rsum) পুশ করুন

  • res mod m রিটার্ন করুন

উদাহরণ

বेहतर বোঝার জন্য নিচের ইমপ্লিমেন্টেশন দেখুন −

def solve(nums):
    m = int(1e9+7)
    stack = []
    rsum = 0
    res = 0
    nums.append(0)
    for i, v in enumerate(nums):
        while stack and nums[stack[-1][0]] >= v:
            index, _ = stack.pop()
            arrSum = rsum
            if stack:
                arrSum = rsum - stack[-1][1]
            res = max(res, nums[index]*arrSum)
        rsum += v
        stack.append((i, rsum))
    return res % m

nums = [2,3,4,3]
print(solve(nums))

ইনপুট

[2,3,4,3]

আউটপুট

30

  1. Python-এ সর্বোচ্চ বিল্ডিং হাইট বের করার প্রোগ্রাম

  2. পাইথনে BST-এ নির্দিষ্ট রেঞ্জে থাকা নোডের সংখ্যা খুঁজে বের করার প্রোগ্রাম

  3. পাইথনে ম্যাক্সিমাম সাবঅ্যারে (Maximum Subarray)

  4. পাইথনে তিনটি সংখ্যার মধ্যে সর্বোচ্চ মান বের করা