Maximum Subarray
תת־מערך הוא רצף של איברים סמוכים ברשימה, ללא פערים ביניהם. מבין כל תתי־המערכים הלא ריקים של רשימת מספרים שלמים, רוצים למצוא את זה שסכום איבריו הוא הגדול ביותר, ולהחזיר את הסכום הזה.
ב־[2, -4, 3, -1, 5, -6, 1] הרצף הטוב ביותר הוא [3, -1, 5], וסכומו 7. הוא כולל את -1 כי 5 שאחריו מפצה עליו ואף יותר, ומשמיט את 2 שבהתחלה כי -4 שאחריו עולה יותר ממה שה־2 תורם.
הפתרון הקלאסי במעבר אחד הוא האלגוריתם של Kadane. עוברים על הרשימה ושומרים את הסכום הטוב ביותר של רצף שמסתיים באיבר הנוכחי. בכל איבר יש רק שתי אפשרויות: להאריך את הרצף שהסתיים באיבר הקודם, או להתחיל מחדש רצף חדש שמתחיל כאן. הארכה משתלמת רק כל עוד סכום הרצף הקודם חיובי; ברגע שהסכום הזה יורד לאפס או מתחתיו, המשך צבירתו יכול רק להזיק, ולכן מתחילים מחדש. התשובה היא סכום הרצף הגדול ביותר שנמצא לאורך הדרך.
בדוגמה, סכומי הרצף הטובים ביותר שמסתיימים בכל מיקום הם 2, -2, 3, 2, 7, 1 ו־2, ולכן התשובה היא 7. בוחנים כל איבר פעם אחת, ולכן היקף העבודה גדל באופן ליניארי ביחס לאורך הרשימה.
כתבו פונקציה בשם maxSubArray שמקבלת רשימה של מספרים שלמים nums ומחזירה את הסכום הגדול ביותר של תת־מערך רציף ולא ריק של nums.
אילוצים: 1 ≤ nums.length ≤ 10^5, -10^4 ≤ nums[i] ≤ 10^4.
פונקציה
- arg1integer-array
- מחזירהinteger
דוגמאות
- קלט
- arg1 = [2, -4, 3, -1, 5, -6, 1]
- פלט
- 7
- קלט
- arg1 = [-3, -1, -2]
- פלט
- -1
+12 בדיקות נסתרות בשליחה
רמזים
פתחו אותם אחד אחד. כל רמז חושף קצת יותר.
התמקדו ברצפים שמסתיימים בדיוק במיקום אחד. איך הרצף הטוב ביותר שמסתיים כאן קשור לרצף הטוב ביותר שמסתיים במיקום שלפניו?
רצף שמסתיים באיבר הנוכחי ממשיך את הרצף שהסתיים ממש לפניו או מתחיל מחדש באיבר הזה. המשך הרצף מועיל רק כאשר הסכום של הרצף הקודם חיובי.
עבור על הרשימה פעם אחת ושמור שני מספרים: הסכום הטוב ביותר של רצף שמסתיים באיבר הנוכחי, והסכום הטוב ביותר שנראה עד כה. התחל את שניהם באיבר הראשון, כך שגם רשימה שמכילה רק מספרים שליליים תחזיר את האיבר הגדול ביותר שלה.
הסבר מלא לבעיה הזאת יגיע בקרוב.
בעיות דומות
בעיות שמשתמשות באותם רעיונות. פתרון של שתיים או שלוש מהן מקבע את הדפוס.
Python
def maxSubArray(nums):
# כתבו את הקוד כאןמקרה 1
מקרה 2
קלט
arg1 = [2, -4, 3, -1, 5, -6, 1]
צפוי
7