ویرگول
ورودثبت نام
علی برادر خدام خسروشاهی
علی برادر خدام خسروشاهیعلی برادر خدام خسروشاهی نویسنده و برنامه نویس
علی برادر خدام خسروشاهی
علی برادر خدام خسروشاهی
خواندن ۲ دقیقه·۹ ماه پیش

حل سوال استخدامی برنامه نویسی پایتون قسمت هفتم با علی برادر خدام خسروشاهی

LeetCode75

238. Product of Array Except Self

Given an integer array nums, return an array answer such that answer[i] is equal to the product of all the elements of nums except nums[i].

The product of any prefix or suffix of nums is guaranteed to fit in a 32-bit integer.

You must write an algorithm that runs in O(n) time and without using the division operation.

Example 1:

Input: nums = [1,2,3,4] Output: [24,12,8,6]

Example 2:

Input: nums = [-1,1,0,-3,3] Output: [0,0,9,0,0]

Constraints:

  • 2 <= nums.length <= 105
  • -30 <= nums[i] <= 30
  • The input is generated such that answer[i] is guaranteed to fit in a 32-bit integer.

📌 محصول آرایه به جز خود عنصر (O(n) بدون تقسیم)

این سؤال می‌خواهد که برای هر عنصر آرایه، حاصل‌ضرب تمام عناصر دیگر محاسبه شود، اما بدون استفاده از عمل تقسیم.
ما باید راهی پیدا کنیم که در زمان O(n) حل شود.

📌 ایده‌ی اصلی (استفاده از دو آرایه‌ی prefix و suffix)

✅ ایده‌ی کلی این است که برای هر عنصر nums[i]:

  • حاصل‌ضرب همه عناصر قبل از آن (prefix product)
  • حاصل‌ضرب همه عناصر بعد از آن (suffix product)
  • سپس این دو مقدار را در هم ضرب کنیم.

بدون نیاز به O(n²) یا تقسیم، این کار را در O(n) انجام می‌دهیم.

📌 کد O(n) بدون تقسیم:

class Solution:

def productExceptSelf(self, nums):

n = len(nums)

# مقدار اولیه برای همه عناصر برابر ۱ است.

answer = [1] * n

# ۱. محاسبه‌ی محصولات Prefix از چپ به راست

prefix = 1

for i in range(n):

answer[i] = prefix

# مقدار prefix را به‌روزرسانی کن

prefix *= nums[i]

# ۲. محاسبه‌ی محصولات Suffix از راست به چپ

suffix = 1

for i in range(n - 1, -1, -1):

# مقدار suffix را در مقدار فعلی answer[i] ضرب کن

answer[i] *= suffix

# مقدار suffix را به‌روزرسانی کن

suffix *= nums[i]

return answer

# علی برادر خدام خسروشاهی


📌 توضیح مرحله‌به‌مرحله

✅ ۱. محاسبه‌ی prefix (محصول عناصر قبل از nums[i])

  • prefix ابتدا ۱ است.
  • هر بار مقدار prefix در nums[i] ضرب شده و در prefix بعدی ذخیره می‌شود.

✅ ۲. محاسبه‌ی suffix (محصول عناصر بعد از nums[i])

  • suffix ابتدا ۱ است.
  • مقدار answer[i] در مقدار suffix ضرب شده و suffix به‌روزرسانی می‌شود.

📌 پیچیدگی زمانی و فضایی

✅ پیچیدگی زمانی: O(n) (دو بار عبور از آرایه)
✅ پیچیدگی فضایی: O(1) (چون فقط از متغیرهای prefix و suffix استفاده کردیم و answer را از قبل داشتیم)

📌 نتیجه‌گیری

  • این روش نیازی به O(n²) محاسبه‌ی ضرب ندارد.
  • این روش نیازی به تقسیم (/) ندارد که در برخی موارد مشکل ایجاد می‌کند.
  • این روش بهینه‌ترین روش O(n) برای این مسئله است. 🚀

علی برادر خدام خسروشاهی

پایتونبرنامه نویسیالگوریتم
۳
۰
علی برادر خدام خسروشاهی
علی برادر خدام خسروشاهی
علی برادر خدام خسروشاهی نویسنده و برنامه نویس
شاید از این پست‌ها خوشتان بیاید