כאשר אנחנו מדברים על לפתור שאלת ליטקוד, הרי שבעצם אנחנו מדברים על לקחת בעיה כלשהי, ולנסות למצוא את הפתרון שלה, שיעבוד בדרך הקצרה ביותר והיעילה ביותר מבחינת צריכת משאבים וכולי.
וכדי לפתור שאלת ליטקוד בצורה נכונה, עלינו לנסות להבין את השאלה וכולי ולמצוא את החוקיות שבה ניתן לפתור את השאלה, בצורה היעילה ביותר.
אבל ישנם מצבים, שבהם אין איזו חוקיות כלשהי ושאין איזה קיצור דרך כלשהו שיכול לפתור את הבעיה. ישנם מצבים שבהם לדוגמא באמת צריך לעבור ולבדוק את כל המקרים האפשריים ושאין בהם איזה טריק שיכול לעבור על כל המצבים באיזה קיצור דרך. והשאלה היא, איך בעצם צריכים להתמודד עם שאלות כאלו, שאנחנו לא מוצאים להם איזו חוקיות שאיתה יהיה ניתן לעשות איזה קיצור דרך ולקצר את זמני הריצה?
והתשובה היא, שאכן ישנן שאלות שיש אפשרות למצוא להן קיצור דרך כדי לקצר את זמני הריצה וכולי, אבל ישנן שאלות שאכן באמת אין אפשרות לקצר בהן את זמני הריצה וכיו"ב. וכאשר אנחנו מגיעים לשאלה שאנחנו לא מוצאים איזה קיצור דרך איך לקצר את זמני הריצה, הרי שעלינו לקחת כל השאלה ולחלק אותה לחלקים ולתתי תהליכים.
ועבור כל תהליך בפתרון של השאלה, עלינו להתייחס אליו בנפרד, ועלינו לראות אולי כן יש איזה קיצור דרך חלקי לתת תהליך כלשהו, בפתרון המלא של השאלה. דהיינו, גם אם באמת אין איזה קיצור דרך שיקצר באופן רציני את זמן הריצה, אולי יש איזה קיצור דרך שיקצר חלק כלשהו בפתרון השאלה.
דהיינו, 1- קח את השאלה, תחלק אותה לחלקים, ותמצא קיצור דרך גם לחלק מתתי התהליכים, גם זה טוב. גם אם התהליך הראשי של הפונקציה, לא ניתן למצוא לו קיצור דרך.
עניין נוסף, גם קיצור דרך חלקי, גם הוא טוב. דהיינו, גם אם באמת לא ניתן לעשות איזה קיצור דרך רציני לזמני הריצה, אולי עדיין יש אפשרות לקצר קצת את זמני הריצה, או את כמות צריכת החישובים וכיו"ב.
לדוגמא: נניח שאנחנו צריכים לעבור על כל האפשרויות האפשריות, עדיין אולי בתוך כל האפשרויות האלו יש אפשרויות שחוזרות על עצמן, או שחלקים של האפשרויות האלו, חוזרים על עצמם. ואולי ניתן לקצר קצת את התהליך שבו בודקים את כל האפשרויות האפשריות, לדוגמא באמצעות שמירה של התוצאה של החישובים שעושים ולאחר מכן לבדוק בתוך האפשרויות שכבר חישבנו אותן קודם לכן וכיו"ב. במילים אחרות, גם קיצור דרך חלקי, גם הוא טוב.
דהיינו: 1 - חפש קיצורי דרך גם לתתי חלקים בפתרון השאלה. 2 - חפש קיצרי דרך חלקיים שעוזרים אפילו קצת לפתרון השאלה.
נקודה נוספת שצריכים לקחת בחשבון, שהיא אולי הקריטית ביותר כאשר פותרים שאלה שאין לה איזה טריק שאפשרי לפתור אותה, הוא שמי שפותר שאלה בלי קיצור דרך ובלי טריק, הוא חייב להיות מסוגל להוכיח שאין אפשרות לקיצור דרך.
דהיינו, אם לדוגמא הגעת לשאלה שאתה לא מוצא איזו חוקיות כלשהי לפתור את כל המקרים האפשריים, בלי לעבור על כל המקרים האפשריים, הרי שעליך להיות מסוגל להוכיח שאין אפשרות למצוא קיצור דרך ולהיות מסוגל להוכיח שאכן חייבים לבדוק את כל המקרים האפשריים.
במילים אחרות, לפעמים התשובה לשאלת LeetCode היא בכך שמוצאים איזה קיצור דרך איך לעבור על כל המקרים האפשריים, בדרך מאוד קצרה. אבל לפעמים התשובה הנדרשת, היא היכולת להוכיח שאין קיצור דרך ולהוכיח שהפתרון שלך, אין אפשרות לפתור את השאלה, בצורה שיותר טובה ממנו.
לסיכום: אם הגעת לשאלת ליטקוד שאתה לא מצליח למצוא לה איזה פתרון בקיצור דרך לזמני הריצה וכיו"ב, אז עליך להוכיח שאין אפשרות למצוא קיצור דרך, להסביר, למה אין אפשרות למצוא קיצור דרך. ולאחר מכן למצוא את כל קיצורי הדרך שכן אפשרי למצוא לחלקים בתוך פתרון השאלה.
וכדי לפתור שאלת ליטקוד בצורה נכונה, עלינו לנסות להבין את השאלה וכולי ולמצוא את החוקיות שבה ניתן לפתור את השאלה, בצורה היעילה ביותר.
אבל ישנם מצבים, שבהם אין איזו חוקיות כלשהי ושאין איזה קיצור דרך כלשהו שיכול לפתור את הבעיה. ישנם מצבים שבהם לדוגמא באמת צריך לעבור ולבדוק את כל המקרים האפשריים ושאין בהם איזה טריק שיכול לעבור על כל המצבים באיזה קיצור דרך. והשאלה היא, איך בעצם צריכים להתמודד עם שאלות כאלו, שאנחנו לא מוצאים להם איזו חוקיות שאיתה יהיה ניתן לעשות איזה קיצור דרך ולקצר את זמני הריצה?
והתשובה היא, שאכן ישנן שאלות שיש אפשרות למצוא להן קיצור דרך כדי לקצר את זמני הריצה וכולי, אבל ישנן שאלות שאכן באמת אין אפשרות לקצר בהן את זמני הריצה וכיו"ב. וכאשר אנחנו מגיעים לשאלה שאנחנו לא מוצאים איזה קיצור דרך איך לקצר את זמני הריצה, הרי שעלינו לקחת כל השאלה ולחלק אותה לחלקים ולתתי תהליכים.
ועבור כל תהליך בפתרון של השאלה, עלינו להתייחס אליו בנפרד, ועלינו לראות אולי כן יש איזה קיצור דרך חלקי לתת תהליך כלשהו, בפתרון המלא של השאלה. דהיינו, גם אם באמת אין איזה קיצור דרך שיקצר באופן רציני את זמן הריצה, אולי יש איזה קיצור דרך שיקצר חלק כלשהו בפתרון השאלה.
דהיינו, 1- קח את השאלה, תחלק אותה לחלקים, ותמצא קיצור דרך גם לחלק מתתי התהליכים, גם זה טוב. גם אם התהליך הראשי של הפונקציה, לא ניתן למצוא לו קיצור דרך.
עניין נוסף, גם קיצור דרך חלקי, גם הוא טוב. דהיינו, גם אם באמת לא ניתן לעשות איזה קיצור דרך רציני לזמני הריצה, אולי עדיין יש אפשרות לקצר קצת את זמני הריצה, או את כמות צריכת החישובים וכיו"ב.
לדוגמא: נניח שאנחנו צריכים לעבור על כל האפשרויות האפשריות, עדיין אולי בתוך כל האפשרויות האלו יש אפשרויות שחוזרות על עצמן, או שחלקים של האפשרויות האלו, חוזרים על עצמם. ואולי ניתן לקצר קצת את התהליך שבו בודקים את כל האפשרויות האפשריות, לדוגמא באמצעות שמירה של התוצאה של החישובים שעושים ולאחר מכן לבדוק בתוך האפשרויות שכבר חישבנו אותן קודם לכן וכיו"ב. במילים אחרות, גם קיצור דרך חלקי, גם הוא טוב.
דהיינו: 1 - חפש קיצורי דרך גם לתתי חלקים בפתרון השאלה. 2 - חפש קיצרי דרך חלקיים שעוזרים אפילו קצת לפתרון השאלה.
נקודה נוספת שצריכים לקחת בחשבון, שהיא אולי הקריטית ביותר כאשר פותרים שאלה שאין לה איזה טריק שאפשרי לפתור אותה, הוא שמי שפותר שאלה בלי קיצור דרך ובלי טריק, הוא חייב להיות מסוגל להוכיח שאין אפשרות לקיצור דרך.
דהיינו, אם לדוגמא הגעת לשאלה שאתה לא מוצא איזו חוקיות כלשהי לפתור את כל המקרים האפשריים, בלי לעבור על כל המקרים האפשריים, הרי שעליך להיות מסוגל להוכיח שאין אפשרות למצוא קיצור דרך ולהיות מסוגל להוכיח שאכן חייבים לבדוק את כל המקרים האפשריים.
במילים אחרות, לפעמים התשובה לשאלת LeetCode היא בכך שמוצאים איזה קיצור דרך איך לעבור על כל המקרים האפשריים, בדרך מאוד קצרה. אבל לפעמים התשובה הנדרשת, היא היכולת להוכיח שאין קיצור דרך ולהוכיח שהפתרון שלך, אין אפשרות לפתור את השאלה, בצורה שיותר טובה ממנו.
לסיכום: אם הגעת לשאלת ליטקוד שאתה לא מצליח למצוא לה איזה פתרון בקיצור דרך לזמני הריצה וכיו"ב, אז עליך להוכיח שאין אפשרות למצוא קיצור דרך, להסביר, למה אין אפשרות למצוא קיצור דרך. ולאחר מכן למצוא את כל קיצורי הדרך שכן אפשרי למצוא לחלקים בתוך פתרון השאלה.