↓快轉到主要內容
  1. LeetCode/

LeetCode 167: Two Sum II - Input Array Is Sorted

·1 分鐘· ·
LeetCode Medium Array Two-Pointers Binary-Search
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2022-10-27

  • 提交紀錄:Runtime Error ×2 → Wrong Answer → Runtime Error ×2 → Wrong Answer ×5 → Accepted → Wrong Answer ×3 → Accepted ×2 → Wrong Answer → Accepted

解題思路
#

陣列已排序(Two Pointers 模板一):左指針在最小、右指針在最大。和太大就讓右指針左移(換一個比較小的),太小就讓左指針右移。每一步排除一個不可能的數,O(n)。題目的 index 從 1 開始。

我的嘗試
#

2022 年提交了 18 次:

  • 一開始兩個指標都從左邊開始,和太大時同時移動兩個,一直找不到答案或超出範圍,例如 [2, 3, 5]、target = 8。
  • 改成從兩端開始之後,有一版和太小時寫成 l -= 1,方向反了,例如 [1, 4]、target = 5 找不到。2026 年重寫時則是忘了 index 從 1 開始,回傳了 [0, 1]。

正確解法
#

class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        l, r = 0, len(numbers) - 1
        while l < r:
            s = numbers[l] + numbers[r]
            if s == target:
                return [l + 1, r + 1]
            if s > target:
                r -= 1
            else:
                l += 1

複雜度
#

時間 O(n),空間 O(1)。也可以對每個數二分找另一半,O(n log n)。

要特別避免的錯誤
#

  • 和太小時是左指針往右(l += 1),不是往左。
  • 回傳的 index 要加 1。

面試口說整理
#

陣列已排序,我從兩端開始,和太大就把右邊往左移、太小就把左邊往右移,相等就回傳兩個從 1 開始的 index。時間 O(n)、空間 O(1)。

相關文章

LeetCode 75: Sort Colors
·1 分鐘
LeetCode Medium Array Two-Pointers Sorting Quicksort
LeetCode 75 解題筆記:荷蘭國旗:low 左邊都是 0、high 右邊都是 2;遇到 2 換到 high 之後不要前進,換過來的數還沒檢查
LeetCode 80: Remove Duplicates from Sorted Array II
·1 分鐘
LeetCode Medium Array Two-Pointers
LeetCode 80 解題筆記:每個值最多留兩個:跟寫入位置往前第二個 nums[k - 2] 比,不一樣才寫
LeetCode 81: Search in Rotated Sorted Array II
·1 分鐘
LeetCode Medium Array Binary-Search
LeetCode 81 解題筆記:有重複值時 nums[l] == nums[mid] 會分不出哪一半有序,這時只能把 l 往右移一格;最壞 O(n)
LeetCode 74: Search a 2D Matrix
·1 分鐘
LeetCode Medium Array Binary-Search Matrix
LeetCode 74 解題筆記:每列接上一列是完整排序的,把矩陣當成長度 m × n 的一維陣列二分,mid 換成 (mid // n, mid % n)
LeetCode 31: Next Permutation
·1 分鐘
LeetCode Medium Array Two-Pointers
LeetCode 31 解題筆記:從右邊找第一個下降的位置 i,跟右邊比它大的最小值交換,再把 i 之後反轉;比較時要包含等於
LeetCode 33: Search in Rotated Sorted Array
·1 分鐘
LeetCode Medium Array Binary-Search
LeetCode 33 解題筆記:旋轉後 mid 的左右一定有一邊是排序好的,判斷目標在不在那一邊,在就往那邊找,不在就去另一邊