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


相关推荐
地平线开发者2 小时前
征程6 MCU safetylib sample
算法·自动驾驶
Barkamin2 小时前
归并排序的简单实现
数据结构
小范自学编程2 小时前
算法训练营 Day37 - 动态规划part06
算法·动态规划
星空露珠2 小时前
迷你世界UGC3.0脚本Wiki角色模块管理接口 Actor
开发语言·数据库·算法·游戏·lua
我星期八休息2 小时前
深入理解哈希表
开发语言·数据结构·c++·算法·哈希算法·散列表
一叶落4382 小时前
LeetCode 54. 螺旋矩阵(C语言详解)——模拟 + 四边界收缩
java·c语言·数据结构·算法·leetcode·矩阵
寻寻觅觅☆3 小时前
东华OJ-进阶题-19-排队打水问题(C++)
开发语言·c++·算法
Techblog of HaoWANG3 小时前
目标检测与跟踪(9)-- Jetson Xavier NX GPIO控制3D结构光C与Python双版本实现(中)
c语言·人工智能·目标检测
Storynone3 小时前
【Day27】LeetCode:56. 合并区间,738. 单调递增的数字
python·算法·leetcode