✍️ برای پیدا کردن بیشترین جمع، لازم نیست همه جمعها را در یک فهرست ذخیره کنیم. جمع پنجره فعلی و بهترین جمع تا اینجا کافیاند. بعد از هر حرکت، اول جمع فعلی را اصلاح کن، سپس آن را با بهترین مقدار مقایسه کن. این روش علاوه بر پیمایش خطی، حافظه کمکی ثابتی برای محاسبه نگه میدارد.
مثلاً در [-5, -1, -4] با طول دو، جمع پنجرهها منفی شش و منفی پنج است؛ جواب منفی پنج است. اگر بهترین را از صفر آغاز کنی، هیچکدام بزرگتر نمیشوند و جواب صفر میدهی، در حالی که هیچ پنجرهای با جمع صفر نداریم. بهترین اولیه باید جمع اولین پنجره معتبر باشد.
تابع را از صفر بنویس و کنترل طول نامعتبر را پیش از هر محاسبه انجام بده. اینجا خروجی فقط عدد بیشینه است، پس تساوی چند پنجره نیاز به انتخاب شاخص ندارد. برای k یک، عملاً بزرگترین عضو را مییابیم؛ برای k برابر طول، فقط جمع کل وجود دارد. خطای رایج، انتخاب چند عدد بزرگِ غیرپیوسته یا نادیده گرفتن اعضای منفی است. طول پنجره باید در همه مسیرها دقیقاً k بماند.
تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا میزند و حفظ ورودی را بررسی میکند. آن را تغییر نده؛ پاسخ تو همان تابع خواستهشده است.
فعالیت شما
تابع max_window_sum(nums,k) فهرست اعداد صحیح و k صحیح میگیرد و بیشترین جمع میان پنجرههای پیوسته دقیقاً k عضوی را عددی برمیگرداند. اگر k<=0 یا k>len(nums)، شامل خالی، None بده. منفیها معتبرند؛ max_window_sum([-5,-1,-4],2)=-5. k=1 و k=len را پوشش بده؛ ورودی تغییر نکند و جمع را با ورود/خروج بهروز کن. تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا میزند و حفظ ورودی را بررسی میکند. آن را تغییر نده؛ پاسخ تو همان تابع خواستهشده است.