✍️ اگر عدد فعلی هفت و هدف دوازده باشد، به دنبال پنج در اعضای قبلی هستیم. دیکشنری میتواند برای هر مقدار، اولین شاخص دیدهشده را نگه دارد. قبل از ثبت عدد فعلی، مکملش را در جدول میگردیم؛ بنابراین هیچ وقت همان خانه را دوبار مصرف نمیکنیم. این ترتیبِ «بررسی، بعد ثبت» بخش مهم راهحل است.
مثلاً در [4, 8, 3, 9] با هدف دوازده، هنگام رسیدن به هشت مکمل چهار قبلاً دیده شده و پاسخ [0,1] است. اگر چند جواب ممکن باشد، قرارداد را دقیقتر میکنیم: اولین شاخص دوم در پیمایش و سپس اولین شاخص قبلیِ مکمل را برگردون. برای این کار جای ثبتشده یک مقدار تکراری را بازنویسی نکن.
خروجی در نبود زوج، یک فهرست خالی است. منفی بودن عددها مشکلی ندارد، چون مکمل همچنان با تفریق به دست میآید. خطای رایج، ساختن جدول از کل ورودی و بعد جستوجو بدون توجه به شاخص یکسان است. این نسخه در حالت معمول با یک پیمایش و حافظه متناسب با مقدارهای متفاوت کار میکند؛ زمانسنجی جزو معیارهای تمرین نیست، اما ساختار راهحل باید همین الگو را نشان بدهد.
تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا میزند و حفظ ورودی را بررسی میکند. آن را تغییر نده؛ پاسخ تو همان تابع خواستهشده است.
فعالیت شما
تابع two_sum(nums,target) فهرست اعداد صحیح و هدف صحیح میگیرد و [i,j] با i<j و nums[i]+nums[j]==target میدهد، یا اگر زوجی نیست [] میدهد. از چپ به راست اولین j ممکن، و برای آن کوچکترین i را انتخاب کن. خالی/تکعضوی بیزوجاند؛ مقدار مساوی در دو خانه مجاز است. two_sum([2,2,7],9)=[0,2]. ورودی را تغییر نده؛ از دیکشنری اعضای قبلی استفاده کن. تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا میزند و حفظ ورودی را بررسی میکند. آن را تغییر نده؛ پاسخ تو همان تابع خواستهشده است.