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

পাইথনে লোকাল পিক (local peaks) এর ইনডেক্স খুঁজে বের করার প্রোগ্রাম

পাইথনে একটি নাম্বার লিস্ট nums দেওয়া আছে। লিস্টের সব পিক এলিমেন্টের (peak element) ইনডেক্স খুঁজে বের করতে হবে, অ্যাসেন্ডিং ক্রমে। একটি ইনডেক্স i পিক এলিমেন্ট হবে যদি নিচের তিনটি শর্ত সফল হয়:

  1. ডান পাশে nums[i]-এর থেকে ভিন্ন প্রথম সংখ্যা না থাকলে অথবা সেটি nums[i]-এর চেয়ে ছোট হলে
  2. বাম পাশে nums[i]-এর থেকে ভিন্ন প্রথম সংখ্যা না থাকলে অথবা সেটি nums[i]-এর চেয়ে ছোট হলে
  3. বাম বা ডান পাশে কমপক্ষে একটি সংখ্যা আছে যা nums[i]-এর থেকে ভিন্ন

উদাহরণ

ইনপুট: nums = [5, 8, 8, 8, 6, 11, 11]

আউটপুট: [1, 2, 3, 5, 6]

ব্যাখ্যা: ৮-এর প্ল্যাটো (plateau) ইনডেক্স ১, ২, ৩ পিক হিসেবে গণ্য হয়েছে। ১১-এর প্ল্যাটো ইনডেক্স ৫, ৬ পিক হিসেবে গণ্য হয়েছে।

এলগরিদম

  1. n = len(nums), ans = [], i = 0
  2. যখন i < n:
    • i0 = i (প্ল্যাটোর শুরু)
    • যখন i < n এবং nums[i] == nums[i0]: i += 1 (প্ল্যাটোর শেষ খুঁজুন)
    • শর্ত চেক করুন:
      • বাম পাশ: i0 == 0 বা nums[i0] > nums[i0-1]
      • ডান পাশ: i == n বা nums[i0] > nums[i]
      • নন-ফ্ল্যাট: i0 != 0 বা i != n (কমপক্ষে এক পাশে ভিন্ন মান আছে)
    • যদি সব সত্য হয়: ans.extend(range(i0, i)) (পুরো প্ল্যাটোর ইনডেক্স যোগ করুন)
  3. ans রিটার্ন করুন

পাইথন ইমপ্লিমেন্টেশন

def solve(nums):
    n = len(nums)
    ans = []
    i = 0
    while i < n:
        i0 = i
        while i < n and nums[i] == nums[i0]:
            i += 1
        if (i0 == 0 or nums[i0] > nums[i0 - 1]) and (i == n or nums[i0] > nums[i]):
            if i0 != 0 or i != n:
                ans.extend(range(i0, i))
    return ans

nums = [5, 8, 8, 8, 6, 11, 11]
print(solve(nums))  # Output: [1, 2, 3, 5, 6]

ইনপুট

[5, 8, 8, 8, 6, 11, 11]

আউটপুট

[1, 2, 3, 5, 6]

ব্যাখ্যা

  • প্ল্যাটো হ্যান্ডলিং: একই মানের רציפה সিকোয়েন্স (যেমন ৮,৮,৮) কে একটি প্ল্যাটো হিসেবে বিবেচনা করা হয়। পুরো প্ল্যাটোই পিক হয় যদি এর দু পাশে ছোট মান থাকে।
  • এজ কেস: শুরুতে বা শেষে প্ল্যাটো হলে শুধু এক পাশ চেক করা হয়।
  • ফ্ল্যাট লিস্ট এড়ানো: শর্ত ৩ নিশ্চিত করে যে পুরো লিস্ট একই মান হলে কোনো পিক নেই।

সময় জটিলতা

O(n) — প্রতিটি এলিমেন্ট একবারই ভিজিট হয়। স্পেস: O(1) অতিরিক্ত (আউটপুট বাদে)।

এই অ্যালগরিদমটি প্ল্যাটো-সহ পিক ডিটেকশনের জন্য স্ট্যান্ডার্ড এবং দক্ষ।

  1. পাইথন প্রোগ্রাম - সংখ্যার সুপার ডিজিট বের করুন

  2. পাইথনে বড় সংখ্যার ফ্যাক্টোরিয়াল বের করার প্রোগ্রাম

  3. পাইথনে পলিগনের ক্ষেত্রফল বের করার প্রোগ্রাম

  4. পাইথনে পলিগনের পরিসীমা বের করার প্রোগ্রাম