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. 定义两个指针 leftright

    • 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. 面试高频考点:数组 + 双指针 + 常量空间


相关推荐
小O的算法实验室21 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
‎ദ്ദിᵔ.˛.ᵔ₎21 小时前
LIST 的相关知识
数据结构·list
qq_3395548221 小时前
英飞凌ModusToolbox环境搭建
c语言·eclipse
M--Y21 小时前
Redis常用数据类型
数据结构·数据库·redis
张張4081 天前
(域格)环境搭建和编译
c语言·开发语言·python·ai
郭涤生1 天前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿1 天前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz1 天前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能1 天前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****1 天前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯