The daily seriesDay 3

Interviewer पूछेगा:

Sorted array में pair sum O(n) time और O(1) space में कैसे निकालोगे?

दो किनारे. एक सही pair. Let’s make it click.

पहले थोड़ा खेल के देखो
TWO ENDS. ONE TARGET = 10.

Sum बताता है कौन चलेगा.

1left ↑2142638411right ↑

1 + 11 = 12 → too big. right--

Sorted line के दोनों ends पर दोस्त खड़े हैं. सबसे छोटा left पर, सबसे बड़ा right पर. Target sum बनाना है. हर possible pair try करने की जगह sum बताने दो कि कौन आगे बढ़ेगा.

Sum बड़ा? Right घटाओ. छोटा? Left बढ़ाओ.

[1, 2, 4, 6, 8, 11], target = 10. पहले 1 + 11 = 12. बड़ा है, तो 11 के साथ बाकी कोई larger-left value sum को और बढ़ाएगी. इसलिए right को safely discard करो. अब 1 + 8 = 9, छोटा है — left बढ़ाओ. 2 + 8 = 10, मिल गया.

Pointer move करने का reason sorting है. अगर input unsorted है, यही movement valid नहीं. तब HashMap O(n) expected time / O(n) space, या sort + pointers O(n log n), लेकिन original indices संभालने होंगे.

एक loop, पर proof दो pointers का

Brute force में n(n−1)/2 pairs: O(n²). Two pointers में हर iteration कम से कम एक pointer अंदर जाता है. Gap शुरू में n−1 है और फिर घटता रहता है. Total pointer moves n−1 से ज्यादा नहीं, इसलिए O(n).

Extra state सिर्फ left, right और sum है: O(1) space. Sorting पहले करनी पड़ी तो उसकी time/space अलग count करो. Java/C++ में addition overflow से बचने के लिए sum को long / long long में रख सकते हैं.

3Sum और water container — same family, अलग reason

3Sum में एक number fix करो और बचे sorted suffix पर pair sum. Outer loop O(n), inner pointers O(n), total O(n²). Duplicate answers से बचने के लिए equal fixed values और matched pointer values skip करो.

Container With Most Water में order sorted नहीं है. यहाँ shorter wall को move करते हैं, क्योंकि width घटने पर उसी shorter wall के रहते area बढ़ नहीं सकता. Pointer pattern same दिखता है, लेकिन correctness proof अलग है.

INTERVIEW में बोलो · तुम्हारा ANSWER

“Sorted array में left smallest पर और right largest पर रखूँगा. Sum target से छोटा है तो left++, बड़ा है तो right--. Sorting की वजह से discarded endpoint अब किसी valid pair में काम नहीं आएगा. हर pointer केवल अंदर बढ़ता है, इसलिए O(n) time और O(1) extra space.”

Read it once. फिर अपने words में बोल के देखो.
SPOT IT BEFORE YOU CODE IT

Pattern पहचानो.

Problem में ये दिखेतब ये use करोयहाँ नहीं
Sorted array, pair sumOpposite-end two pointersUnsorted input and original indices needed without extra handling
Triplets sum to zeroSort + fix one + two pointersCalling the whole algorithm O(n)
Max container areaMove shorter wallMoving a pointer without an elimination argument
SAME LOGIC. YOUR LANGUAGE.

अब code लिखते हैं.

Two Sum II · LC 167

Returns 1-based indices, as required by the problem. O(n) time, O(1) space.

def two_sum_sorted(numbers, target):
    left, right = 0, len(numbers) - 1
    while left < right:
        total = numbers[left] + numbers[right]
        if total == target:
            return [left + 1, right + 1]
        if total < target:
            left += 1
        else:
            right -= 1
    return []

assert two_sum_sorted([1, 2, 4, 6, 8, 11], 10) == [2, 5]
WATCHING ISN’T SOLVING. YOUR TURN.

Practice करो. Confidence आएगा.

YOUR PRACTICE BOARD0 / 4 solved

Your progress stays on this device. Solve first, tick later. तू खुद से cheat मत करना.

कल interview है? ये साथ ले जाओ.

Day 3 का full guide — concepts, patterns, code और practice, एक PDF में.

अभी भी doubt है?

HashMap क्यों नहीं?+

वह भी unsorted Two Sum को expected O(n) में solve करता है, पर O(n) extra space लेता है. Sorted input में pointers उसी time पर O(1) space देते हैं.

left <= right क्यों नहीं?+

Same element दो बार use नहीं करना. left < right से indices अलग रहते हैं.

Pointer movement guess नहीं, elimination का proof है. Next: पूरे interval को window बना दो.

UP NEXT / DAY 04A window that knows when to shrink