167. 两数之和 II - 输入有序数组【C语言题解】

题目描述

给你一个下标从 1 开始的整数数组 numbers,数组已按非递减顺序排列。请你从数组中找出满足相加之和等于目标数 target 的两个数。

返回值为长度为 2 的数组 [index1, index2],满足:

  • 1 <= index1 < index2 <= numbers.length

  • 每个输入只对应唯一答案

  • 不可重复使用相同元素

  • 额外空间必须为常量级

示例

复制代码
示例 1:
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]

示例 2:
输入:numbers = [2,3,4], target = 6
输出:[1,3]

示例 3:
输入:numbers = [-1,0], target = -1
输出:[1,2]

解题思路

1️⃣ 双指针法(最优解)

由于数组已经有序,我们可以用双指针:

  1. 定义两个指针 left 和 right:

    • left = 0 (数组开头)

    • right = numbersSize - 1 (数组末尾)

  2. 计算当前和 sum = numbers[left] + numbers[right]

  3. 根据 sum 与 target 比较:

    • sum == target → 找到答案,返回 [left+1, right+1]

    • sum < target → 左指针右移 left++(增大 sum)

    • sum > target → 右指针左移 right--(减小 sum)

这种方法只需常量额外空间,时间复杂度 O(n)。

2️⃣ 为什么一定正确?

  • 数组有序 → 左指针增大,右指针减小

  • 双指针会单调逼近 target,不会漏解


C语言实现

复制代码
#include <stdio.h>
#include <stdlib.h>

int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {
    int left = 0, right = numbersSize - 1;
    int* res = (int*)malloc(sizeof(int) * 2);
    *returnSize = 2;

    while (left < right) {
        int sum = numbers[left] + numbers[right];
        if (sum == target) {
            res[0] = left + 1;   // 下标从1开始
            res[1] = right + 1;
            return res;
        } else if (sum < target) {
            left++;
        } else {
            right--;
        }
    }
    return res; // 理论上不会走到这里
}

// 测试
int main() {
    int numbers[] = {2,7,11,15};
    int target = 9;
    int returnSize;
    int* res = twoSum(numbers, 4, target, &returnSize);
    printf("[%d, %d]\n", res[0], res[1]);
    free(res);
    return 0;
}

输出:

复制代码
[1, 2]

✅ 总结

  1. 题目关键在于数组已排序 → 可以使用双指针

  2. 双指针法:

    • 左指针指向最小值

    • 右指针指向最大值

    • 根据 sum 与 target 比较调整指针

  3. 时间复杂度 O(n),空间复杂度 O(1)

  4. 面试高频考点:数组 + 双指针 + 常量空间


相关推荐
用户979984807182 小时前
200 行代码写一个能跑的 AI Agent:不依赖任何框架,只靠 tool-calling 原理
算法
threerocks2 小时前
【Muse实战】X 流量作战室搭建保姆级教程 - 拥有你自己的运营团队
算法
GreenTea3 小时前
深度拆解 ScienceBuddy:如何用“双层递归自进化”构建高可靠科研 Agent Harness
前端·后端·算法
花椒技术3 小时前
2.46 秒生成 5 秒视频:拆解 H3 Max 的模型、推理栈与硬件协同
算法·音视频开发·视频编码
vivo互联网技术3 小时前
ART:妆容迁移框架,重新定义高保真妆容迁移 | ECCV 2026
人工智能·算法·图像识别
用户0441440924493 小时前
卫星信号模拟器里的四个坐标转换公式
算法
橘和柠3 小时前
阿里 open-code-review (AI代码审查工具)实战:安装、四层规则链、自定义规则格式与实测避坑
算法·面试
得物技术3 小时前
别再只卷向量检索了,得物交易搜索如何用“生成式”实现召回范式跃迁?
人工智能·算法·llm
罗西的思考3 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(4)--- Rollout实现细节
人工智能·算法
罗西的思考3 小时前
机器人 / 物理 Agent Harness 综合分析与对比:从「更强的模型」到「更好的系统」
人工智能·算法·机器学习