給定一個遞增排序的整型數組和一個目標值S,找出數組中和為S的任意兩個數。若有多對,輸出任意一對即可。
left指向頭部(最小值),right指向尾部(最大值)。curSum = data[left] + data[right]:left++。right--。left >= right停止。時間複雜度O(n),空間複雜度O(1),無需額外空間。
#include <stdio.h>
#include <stdbool.h>
bool FindNumbersWithSum(int data[], int length, int sum, int *num1, int *num2) {
if (length < 2 || !num1 || !num2) return false;
int left = 0, right = length - 1;
while (left < right) {
long curSum = (long)data[left] + data[right]; // 防溢出用long
if (curSum == sum) {
*num1 = data[left];
*num2 = data[right];
return true;
} else if (curSum < sum) {
++left;
} else {
--right;
}
}
return false;
}
int main(void) {
int data[] = {1, 2, 4, 7, 11, 15};
int num1, num2;
if (FindNumbersWithSum(data, 6, 15, &num1, &num2))
printf("num1 = %d, num2 = %d\n", num1, num2);
else
printf("Not found\n");
return 0;
}
num1 = 4, num2 = 11
int範圍,建議用long或long long暫存。left++、right--繼續搜尋並跳過重複值。