Two Sum
מקבלים רשימה של מספרים שלמים וערך יעד. בדיוק שני מספרים ברשימה מסתכמים בערך היעד, והתפקיד שלך הוא לדווח באילו מיקומים הם נמצאים.
ניקח את nums = [3, 8, 12, 5] ואת target = 17. הערך 12 נמצא באינדקס 2 והערך 5 נמצא באינדקס 3, ו־12 + 5 = 17, לכן התשובה היא [2, 3].
שני המספרים חייבים להגיע משני מיקומים שונים. ב־[4, 2, 6] עם target = 8, אסור להשתמש ב־4 פעמיים; התשובה היא [1, 2] כי 2 + 6 = 8. עם זאת, אותו ערך יכול להופיע פעמיים: ב־[7, 3, 7] עם target = 14, התשובה היא [0, 2].
כתבו פונקציה בשם twoSum שמקבלת מערך של מספרים שלמים nums ומספר שלם target, ומחזירה מערך של שני אינדקסים [i, j] כך ש-nums[i] + nums[j] שווה ל-target.
האינדקסים חייבים להיות שתי עמדות שונות, ולהיות מוחזרים בסדר עולה (i קטן מ-j). לכל קלט יש בדיוק זוג אחד כזה.
אילוצים: 2 ≤ nums.length ≤ 10^4, -10^9 ≤ nums[i] ≤ 10^9, -10^9 ≤ target ≤ 10^9.
פונקציה
- arg1integer-array
- arg2integer
- מחזירהinteger-array
דוגמאות
- קלט
- arg1 = [3, 8, 12, 5]arg2 = 17
- פלט
- [2, 3]
- קלט
- arg1 = [6, 1, 4, 10]arg2 = 7
- פלט
- [0, 1]
- קלט
- arg1 = [2, -6, 9, 4, 13]arg2 = 3
- פלט
- [1, 2]
+13 בדיקות נסתרות בשליחה
רמזים
פתחו אותם אחד אחד. כל רמז חושף קצת יותר.
בדיקה של כל זוג באמצעות שתי לולאות מקוננות היא נכונה, אבל עבור 10,000 מספרים מדובר בכ-50 מיליון בדיקות. האם תוכל למצוא לכל מספר את בן הזוג שלו בלי לסרוק שוב את הרשימה?
כשאתה עומד על ערך
x, אתה כבר יודע איזה ערך ישלים את הזוג: היעד פחותx. השאלה היחידה היא אם כבר עברת על הערך הזה, ובאיזה אינדקס.עבור על הרשימה פעם אחת ושמור מפת גיבוב שממפה כל ערך שכבר עברת עליו לאינדקס שלו. בכל מיקום, חפש קודם את הערך המשלים החסר; אם הוא נמצא במפה, יש לך את שני האינדקסים. אחרת, שמור את הערך הנוכחי והמשך הלאה. החיפוש לפני השמירה הוא שמונע ממספר להתאים לעצמו.
הסבר מלא לבעיה הזאת יגיע בקרוב.
בעיות דומות
בעיות שמשתמשות באותם רעיונות. פתרון של שתיים או שלוש מהן מקבע את הדפוס.
Python
def twoSum(nums, target):
# כתבו כאן את הקודמקרה 1
מקרה 2
מקרה 3
קלט
arg1 = [3, 8, 12, 5] arg2 = 17
צפוי
[2, 3]