Skip to main content

Command Palette

Search for a command to run...

LeetCode Solution, Medium, 167. Two Sum II - Input Array Is Sorted

Published

I am not a programmer just a leaner. Writing JavaScript, Python, and Go and doing something on Kubernetes.

167. Two Sum II - Input Array Is Sorted

題目敘述

Given a 1-indexed array of integers numbers that is already sorted in non-decreasing order, find two numbers such that they add up to a specific target number. Let these two numbers be numbers[index1] and numbers[index2] where 1 <= index1 < index2 <= numbers.length.

Return the indices of the two numbers, index1 and index2, added by one as an integer array [index1, index2] of length 2.

The tests are generated such that there is exactly one solution. You may not use the same element twice.

Your solution must use only constant extra space.

Example 1:

Input: numbers = [2,7,11,15], target = 9
Output: [1,2]
Explanation: The sum of 2 and 7 is 9. Therefore, index1 = 1, index2 = 2. We return [1, 2].

Example 2:

Input: numbers = [2,3,4], target = 6
Output: [1,3]
Explanation: The sum of 2 and 4 is 6. Therefore index1 = 1, index2 = 3. We return [1, 3].

Example 3:

Input: numbers = [-1,0], target = -1
Output: [1,2]
Explanation: The sum of -1 and 0 is -1. Therefore index1 = 1, index2 = 2. We return [1, 2].

Constraints:

  • 2 <= numbers.length <= 3 * 10**4
  • -1000 <= numbers[i] <= 1000
  • numbers is sorted in non-decreasing order.
  • -1000 <= target <= 1000
  • The tests are generated such that there is exactly one solution.

題目翻譯

給一維陣列的參數 numbers,找出兩個數加總是等於 target 的值,然後回傳其索引。如果沒有符合的就回傳 -1。其中索引的順序是從 1 開始算起的。

解法解析

使用單純的 Two pointers 解法

Time complexity: O(n) Space complexity: O(1)

解法範例

Go

func twoSum(numbers []int, target int) []int {
    var (
        low  int = 0
        high int = len(numbers) - 1
    )
    for low < high {
        total := numbers[low] + numbers[high]
        if total == target {
            return []int{low + 1, high + 1}
        }
        if total < target {
            low++
        } else {
            high--
        }
    }
    return []int{-1, -1}
}

JavaScript

/**
 * @param {number[]} numbers
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function (numbers, target) {
    let low = 0,
        high = numbers.length - 1;
    while (low < high) {
        const sum = numbers[low] + numbers[high];
        if (sum === target) {
            return [low + 1, high + 1];
        }
        if (sum < target) {
            low++;
        } else {
            high--;
        }
    }
    return [-1, -1];
};

Kotlin

class Solution {
    fun twoSum(numbers: IntArray, target: Int): IntArray {
        var low = 0
        var high = numbers.size - 1
        while (low < high) {
            val sum = numbers[low] + numbers[high]
            if (sum == target) {
                return intArrayOf(low + 1, high + 1)
            }
            if (sum < target) {
                low++
            } else {
                high--
            }
        }
        return intArrayOf(-1, -1)
    }
}

PHP

class Solution
{

    /**
     * @param Integer[] $numbers
     * @param Integer $target
     * @return Integer[]
     */
    function twoSum($numbers, $target)
    {
        $low = 0;
        $high = count($numbers) - 1;
        while ($low < $high) {
            $sum = $numbers[$low] + $numbers[$high];
            if ($sum == $target) {
                return [$low + 1, $high + 1];
            }
            if ($sum < $target) {
                $low++;
            } else {
                $high--;
            }
        }
        return [-1, -1];
    }
}

Python

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

Rust

impl Solution {
    pub fn two_sum(numbers: Vec<i32>, target: i32) -> Vec<i32> {
        let mut low = 0;
        let mut high = numbers.len() - 1;
        while low < high {
            let sum = numbers[low]+numbers[high];
            if sum == target {
                return Vec::from([low as i32 + 1, high as i32 + 1]);
            }
            if sum < target {
                low+=1;
            } else {
                high-=1;
            }
        }
        return Vec::from([-1, -1]);
    }
}

Swift

class Solution {
    func twoSum(_ numbers: [Int], _ target: Int) -> [Int] {
        var low: Int = 0
        var high: Int = numbers.count - 1
        while low < high {
            let sum: Int = numbers[low] + numbers[high]
            if sum == target {
                return [low + 1, high + 1]
            }
            if sum < target {
                low += 1
            } else {
                high -= 1
            }
        }

        return [-1, -1]
    }
}

More from this blog

如何開始入門軟體工程領域 - 名詞解釋(長期更新)

現在應該開始有很多人想要踏入軟體工程的領域,但在進入這個領域之前,覺得先了解一些名詞,可以在入門時更有方向也更知道要用什麼關鍵字去找尋有用的資訊。這篇文章就是想要幫助想要入門的人理解一些軟體工程裡的專有名詞。 作業系統 這一區塊主要解釋跟作業系統層面相關的名詞 英文中文解釋 Operation system 簡稱 OS | 作業系統 | 就是電腦的作業系統,是三大作業系統分別是:Linux、Windows、macOS | | Linux | | 自由和開放原始碼的 UNI...

May 10, 2023

我的 MacBook Pro (Apple Silicon) 設定

現在開始因為 ChatGPT 的出現,各種 AI 助手的功能都跑出來了。想想自己用了許久的環境設定也應該要來重新審視和建立新的開發環境了,僅此紀錄我個人的環境配置步驟和設定。 環境前置步驟 還原 MacBook Pro 至全新環境 macOS(全部資料刪除) 設定好初始設定後,登入 Apple ID 進入 App Store 確定 macOS 版本和預設 APP 都更新到最新 macOS 版本 到系統設定調整所有設定至個人習慣的設定 三指拖移 觸控板手勢開啟 防火牆開啟 輸入法設定...

Apr 25, 2023

ChatGPT 下的發展預想

從 ChatGPT 問世到現在,有許許多多的文章和討論出來。先從最早的 Google 要完蛋了,到後來的工作要被取代了,工程師失業了。 我就比較沒有想要馬上出來評論一下,我喜歡讓子彈飛一會兒。跟討論一下我自己比較在意的討論點。 Google 為什麼慢了? 結論:因為他需要更小心 很多人說 Google 怎麼被微軟搶先了一步。剛開始 Bing 說要加上 AI 的時候大家都在說 Google 怎麼慢了。我就馬上跑去看 OpenAI 的網站,靠北呀啊就 Azure 贊助的。那當然在正式上線 ChatG...

Mar 23, 2023

不工程的攻城獅

223 posts

I am not a programmer because I am not good at programming. But I do programming. Love to learn new things. An animal lover and a dancer. My oshi is 潤羽るしあ.