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

পাইথনে প্রথম এবং শেষ পাশ থেকে জোড়া তৈরি করতে অপারেশনের সংখ্যা বের করার প্রোগ্রাম

একটি সমান দৈর্ঘ্যের সংখ্যা তালিকা (nums) দেওয়া আছে। একটি অপারেশনে তালিকার যেকোনো একটি সংখ্যাকে ১ থেকে তালিকার সর্বোচ্চ মান পর্যন্ত যেকোনো মানের সাথে আপডেট করা যাবে। লক্ষ্য হলো কমপক্ষে কতগুলো অপারেশন দরকার যাতে প্রতিটি i-এর জন্য nums[i] + nums[n-1-i] একই মান হয়।

সমস্যা উদাহরণ

ইনপুট: nums = [8, 6, 2, 5, 9, 2]
আউটপুট: 2

ব্যাখ্যা: nums[2] (২) কে ৫ এবং nums[4] (৯) কে ৪ করে দিলে তালিকা হয় [8, 6, 5, 5, 4, 2]। এখন প্রতিটি জোড়ার যোগফল: (৮+২) = (৬+৪) = (৫+৫) = ১০।

সমাধানের পদ্ধতি

  1. N := nums এর আকার
  2. mx := nums এর সর্বোচ্চ মান
  3. events := [] খালি তালিকা
  4. প্রতিটি জোড়া (i, N-i-1) এর জন্য ইভেন্ট পয়েন্ট গণনা করুন:
    • (min(a+1, b+1), 1)
    • (a+b, 1)
    • (a+b+1, -1)
    • (max(a+mx, b+mx)+1, -1)
  5. ইভেন্টগুলো সাজান
  6. সইপ লাইন অ্যালগরিদম ব্যবহার করে সর্বোচ্চ ওভারল্যাপিং ইভেন্ট বের করুন (mx_same)
  7. উত্তর: N - mx_same

পাইথন কোড

def solve(nums):
    N = len(nums)
    mx = max(nums)
    events = []
    idx = 0
    while idx < N // 2:
        a = nums[idx]
        b = nums[N - idx - 1]
        events.append((min(a + 1, b + 1), 1))
        events.append((a + b, 1))
        events.append((a + b + 1, -1))
        events.append((max(a + mx, b + mx) + 1, -1))
        idx += 1
    events.sort()
    current = 0
    mx_same = 0
    for event, delta in events:
        current += delta
        mx_same = max(current, mx_same)
    return N - mx_same

nums = [8, 6, 2, 5, 9, 2]
print(solve(nums))  # আউটপুট: 2

টেস্ট কেস

ইনপুট: [6, 8, 5, 2, 3]
আউটপুট: 2

  1. পাইথনে প্রথম থেকে শেষ নোড পর্যন্ত রেস্ট্রিক্টেড পথের সংখ্যা বের করার প্রোগ্রাম

  2. পাইথনে প্রথম ও শেষ মান সমান সাবলিস্টের সংখ্যা খুঁজে বের করার প্রোগ্রাম

  3. পাইথনে 'a' কে 'a' বা 'b' এবং 'b' কে 'b' রেখে বানানো সম্ভাব্য স্ট্রিং সংখ্যা বের করার প্রোগ্রাম

  4. পাইথনে একটি সংখ্যাকে অন্য সংখ্যায় রূপান্তর করার ন্যূনতম অপারেশন বের করার প্রোগ্রাম