文章目录 题目链接代码法一 暴力枚举超时法二 二分查找 题目链接 167. 两数之和 II - 输入有序数组 代码 法一 暴力枚举超时 /** * Note: The returned array must be malloced, assume caller calls free(). */ int* twoSum(int* numbers, int numbersSize, int target, int* returnSize){ int *ret = (int*)malloc(sizeof(int) * 2); *returnSize = 2; for (int i = 0; i < numbersSize; ++i) { for (int j = i + 1; j < numbersSize; ++j) { if (numbers[i] + numbers[j] == target) { ret[0] = i + 1; ret[1] = j + 1; } } } return ret; } 法二 二分查找 /** * Note: The returned array must be malloced, assume caller calls free(). */ int* twoSum(int* numbers, int numbersSize, int target, int* returnSize){ int low, high, mid; int *ret = (int*)malloc(sizeof(int) * 2); *returnSize = 2; for (int i = 0; i < numbersSize; ++i) { low = i + 1, high = numbersSize - 1; // 1 while (low <= high) { mid = (high + low) / 2; // 2 if (numbers[mid] == target - numbers[i]) { ret[0] = i + 1; ret[1] = mid + 1; return ret; // 3 } else if (numbers[mid] > target - numbers[i]) { high = mid - 1; } else { low = mid + 1; } } } return ret; } 第一个数下标为i时,第二个数从下标为i+1到numbersSize-1进行二分查找"target - numbers[i]"可用mid = (high - low) / 2 + low; 代替, 防止(high + low)超出最大整数范围记得return,否则无限循环