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


相关推荐
qeen8742 分钟前
【数据结构】自平衡二叉搜索树各种旋转算法原理解析及AVL树的C++实现
数据结构·c++·算法
lucas_AI1 小时前
1.2B 小模型赢过 235B 大模型:NaviDC-OCR 把文档解析卷明白了
人工智能·深度学习·算法
程序员与背包客_CoderZ1 小时前
Linux D-Bus通信协议详解:从入门到C/C++编码实战
linux·服务器·c语言·c++·嵌入式硬件·嵌入式软件·dbus
冻柠檬飞冰走茶2 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
民乐团扒谱机2 小时前
【微实验】倒谱算法(Cepstrum)深度解析:原理、数学推导与代码实现
人工智能·算法·语音识别
嵌入式阿蔡2 小时前
HAL库 vs LL库 vs 寄存器:到底用哪个?
c语言·stm32·单片机·嵌入式硬件·嵌入式实时数据库
evans在进步2 小时前
LeetCode 394:字符串解码——Java 单栈模拟与嵌套解析详解
java·python·leetcode
Yyyyyy~3 小时前
【C】C语言常见概念
c语言
Nil2083 小时前
leetcode 189轮转数组
数据结构·算法·leetcode
-dzk-3 小时前
【动态规划】LC 118.杨辉三角
算法·动态规划