LeetCode //167. Two Sum II - Input Array Is Sorted

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 numbersindex1 and numbersindex2 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 < = n u m b e r s . l e n g t h < = 3 ∗ 1 0 4 2 <= numbers.length <= 3 * 10^4 2<=numbers.length<=3∗104
  • -1000 <= numbersi <= 1000
  • numbers is sorted in non-decreasing order.
  • -1000 <= target <= 1000
  • The tests are generated such that there is exactly one solution.

From: LeetCode

Link: 167. Two Sum II - Input Array Is Sorted


Solution:

Ideas:
We start with one pointer at the beginning of the array and another at the end. If the sum of the numbers at the two pointers is less than the target, we move the pointer at the beginning forward to increase the sum. If the sum is greater than the target, we move the pointer at the end backward to decrease the sum. We continue this process until we find two numbers that add up to the target.
Code:
c 复制代码
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize){
    *returnSize = 2;
    int* result = (int*) malloc(*returnSize * sizeof(int));
    int left = 0, right = numbersSize - 1;

    while(left < right){
        int sum = numbers[left] + numbers[right];

        if(sum == target){
            result[0] = left + 1;  // +1 because the problem is 1-indexed
            result[1] = right + 1; // +1 because the problem is 1-indexed
            return result;
        }
        else if(sum < target)
            left++;
        else
            right--;
    }

    // This point should never be reached because the problem guarantees a solution
    return NULL;
}
相关推荐
Frostnova丶2 小时前
【算法笔记】数学知识
笔记·算法
吴可可1233 小时前
AutoCAD 2016与2014二次开发关键差异
算法
雨白4 小时前
哈希:以时间换空间的算法实战
算法
caimouse5 小时前
Reactos 第 4 章 对象管理 — 4.5 几个常用的内核函数
c语言·windows·架构
San813_LDD6 小时前
[数据结构]LeetCode学习
数据结构·算法·图论
x138702859576 小时前
c语言排雷游戏(基础版9*9)
c语言·算法·游戏
caimouse6 小时前
Reactos 第 4 章 对象管理 — 4.3 句柄和句柄表(Handle & Handle Table)
c语言·windows·架构
sheeta19987 小时前
LeetCode 每日一题笔记 日期:2026.06.06 题目:2196. 根据描述创建二叉树
笔记·算法·leetcode
小欣加油7 小时前
leetcode994 腐烂的橘子
数据结构·c++·算法·leetcode·bfs