חיפוש במערך חלקלק

נתון מערך חד-ממדי arr ובו מספרים שלמים.

נגדיר: מערך חלקלק (slippery) הוא מערך שבו ההפרש בין כל שני איברים צמודים הוא לכל היותר 1.

הנה דוגמה למערך חלקלק:

arr = {3, 4, 5, 6, 6, 6, 7, 6, 5, 6, 5, 6, 5, 6, 7, 8, 7, 6, 7, 8, 8, 9, 9, 9, 8, 9, 8}

כתבו את השיטה:

slipperyArraySearch1 המקבלת שני איברים, אחד מהמערך a והשני מהמערך b כך שההפרש (בערך מוחלט) בין שני האיברים האלו הוא הקטן ביותר מבין כל זוגות ההפרשים האפשריים. יש להחזיר את ההפרש ולהדפיס את זוג האיברים.

אפשר להניח שהערך במקום האחרון במערך גדול ממש מהערך במקום הראשון במערך. כתבו שיטה סטטית יעילה ככל האפשר המקבלת מערך חלקלק arr ומספר שלם x שמובטח שהוא גדול או שווה לאיבר הראשון במערך, וקטן או שווה לאיבר האחרון במערך. על השיטה להחזיר את המיקום במערך arr שבו נמצא x. אם הוא לא נמצא, על השיטה להחזיר את הערך -1. אם המספר x מופיע יותר מפעם אחת במערך arr, השיטה צריכה להחזיר אחד מהאינדקסים שבהם המספר מופיע. לא משנה איזה.

לדוגמה, בהינתן המערך arr שכתוב לעיל:

  • אם x=3, השיטה תחזיר 0.
  • אם x=4, השיטה תחזיר 1.
  • אם x=5, השיטה תחזיר אחד מהערכים הבאים: 12, 10, 8, 2 (לא משנה איזה).
  • הערך x=9 לא יכול להיות ערכו של x, כי מובטח שהשיטה לא תיקרא עם ערך x שהוא קטן מ-3 או גדול מ-8 (הערכים שבקצות המערך). אבל שימו לב שערכים כאלה (כמו 9) כן יכולים להיות איברים בתוך המערך.

הנה תיאור מתמטי של ההנחות שניתן להניח:

  • |arr[i] - arr[i+1]| <= 1 for every 0 <= i < arr.length - 1
  • arr[0] < arr[arr.length - 1] and arr[0] <= x <= arr[arr.length - 1]

כתבו את השיטה:

slipperyArraySearch2 המקבלת מערך חלקלק arr ומספר שלם x. על השיטה להחזיר את המיקום במערך arr שבו נמצא x. אם הוא לא נמצא, על השיטה להחזיר את הערך -1. אם המספר x מופיע יותר מפעם אחת במערך arr, השיטה צריכה להחזיר אחד מהאינדקסים שבהם המספר מופיע. לא משנה איזה.

שימו לב: ההבדל בין שני הסעיפים הוא שבסעיף א מובטח שהערך שמחפשים גדול או שווה לאיבר הראשון במערך וקטן או שווה לאיבר האחרון במערך. בסעיף ב לא מובטח דבר לגבי הערך שמחפשים.

השיטות צריכות להיות יעילות ככל האפשר, גם מבחינת סיבוכיות הזמן וגם סיבוכיות המקום צריכה להיות קבועה , O(1).

אילוצים:
  • המערך arr אינו ריק, והוא חלקלק: ההפרש בין כל שני איברים צמודים הוא לכל היותר 1.
  • בסעיף א: arr[0] < arr[arr.length-1] והערך x גדול או שווה לאיבר הראשון וקטן או שווה לאיבר האחרון. השיטה slipperyArraySearch1 לא תיקרא עם ערכים אחרים.
  • בסעיף ב: אין הנחה לגבי ערכו של x.
  • השיטה testBothMethods נועדה לבדיקה בלבד. היא מדפיסה OK אם האינדקס שהוחזר מכיל את x, -1 אם הוחזר -1, ו-N/A אם אסור היה לקרוא לשיטה מסעיף א עבור ערך זה.
דוגמה 1:
קלט:
arr = [3, 4, 5, 6, 6, 6, 7, 6, 5, 6, 5, 6, 5, 6, 7, 8, 7, 6, 7, 8, 8, 9, 9, 9, 8, 9, 8],
x = 3
פלט:
OK
OK

הסבר: x שווה לאיבר הראשון. שתי השיטות מוצאות אותו (האינדקס שמוחזר הוא 0).

דוגמה 2:
קלט:
arr = [3, 4, 5, 6, 6, 6, 7, 6, 5, 6, 5, 6, 5, 6, 7, 8, 7, 6, 7, 8, 8, 9, 9, 9, 8, 9, 8],
x = 4
פלט:
OK
OK

הסבר: x=4 מופיע פעם אחת, באינדקס 1.

דוגמה 3:
קלט:
arr = [3, 4, 5, 6, 6, 6, 7, 6, 5, 6, 5, 6, 5, 6, 7, 8, 7, 6, 7, 8, 8, 9, 9, 9, 8, 9, 8],
x = 5
פלט:
OK
OK

הסבר: x=5 מופיע במספר מקומות (אינדקסים 2, 8, 10, 12). כל אחד מהם הוא תשובה תקינה, ולכן הבדיקה מדפיסה OK כל עוד האינדקס שהוחזר מכיל את x.

דוגמה 4:
קלט:
arr = [3, 4, 5, 6, 6, 6, 7, 6, 5, 6, 5, 6, 5, 6, 7, 8, 7, 6, 7, 8, 8, 9, 9, 9, 8, 9, 8],
x = 8
פלט:
OK
OK

הסבר: x שווה לאיבר האחרון במערך. מותר לקרוא לשיטה מסעיף א עם ערך זה, והיא מוצאת אותו.

דוגמה 5:
קלט:
arr = [3, 4, 5, 6, 6, 6, 7, 6, 5, 6, 5, 6, 5, 6, 7, 8, 7, 6, 7, 8, 8, 9, 9, 9, 8, 9, 8],
x = 9
פלט:
N/A
OK

הסבר: x=9 גדול מהאיבר האחרון (8), ולכן אסור לקרוא לשיטה מסעיף א והיא מסומנת N/A. שיטה ב מוצאת את 9 שנמצא בתוך המערך.

דוגמה 6:
קלט:
arr = [3, 4, 5, 6, 6, 6, 7, 6, 5, 6, 5, 6, 5, 6, 7, 8, 7, 6, 7, 8, 8, 9, 9, 9, 8, 9, 8],
x = 2
פלט:
N/A
-1

הסבר: x=2 קטן מהאיבר הראשון (3), ולכן סעיף א לא רלוונטי (N/A). הערך לא נמצא במערך ושיטה ב מחזירה -1.

דוגמה 7:
קלט:
arr = [3, 4, 5, 6, 6, 6, 7, 6, 5, 6, 5, 6, 5, 6, 7, 8, 7, 6, 7, 8, 8, 9, 9, 9, 8, 9, 8],
x = 10
פלט:
N/A
-1

הסבר: x=10 גדול מכל האיברים במערך. סעיף א לא רלוונטי (N/A), ושיטה ב מחזירה -1.

דוגמה 8:
קלט:
arr = [9, 8, 8, 7, 6, 5, 5, 4],
x = 6
פלט:
N/A
OK

הסבר: מערך חלקלק יורד (האיבר הראשון גדול מהאחרון). ההנחה של סעיף א לא מתקיימת, ולכן N/A. שיטה ב מוצאת את 6.

דוגמה 9:
קלט:
arr = [-3, -2, -3, -2, -1, 0, -1, 0, 1],
x = -1
פלט:
OK
OK

הסבר: מערך עם ערכים שליליים. x=-1 מופיע באינדקסים 4 ו-6 וכל אחד מהם תקין.

דוגמה 10:
קלט:
arr = [1, 2, 3, 4, 5],
x = 3
פלט:
OK
OK

הסבר: מערך עולה שבו ההפרש בין כל שני איברים צמודים הוא בדיוק 1.

דוגמה 11:
קלט:
arr = [5, 5, 5, 6],
x = 6
פלט:
OK
OK

הסבר: הערך מופיע רק בסוף המערך, ושיטה ב חייבת להגיע אליו.

דוגמה 12:
קלט:
arr = [5],
x = 7
פלט:
N/A
-1

הסבר: מערך באורך 1 וערך שלא מופיע בו. סעיף א לא רלוונטי (N/A) ושיטה ב מחזירה -1.

בינוניהפתוחה – 2026ב', שאלון 468, מועד 98