第 14 題(數組):
題目:輸入一個已經按升序排序過的數組和一個數字,
在數組中查找兩個數,使得它們的和正好是輸入的那個數字。
要求時間復雜度是 O(n)。如果有多對數字的和等於輸入的數字,輸出任意一對即可。
例如輸入數組 1、2、4、7、11、15 和數字 15。由於 4+11=15,因此輸出 4 和 11。
要求時間是O(n)肯定就只能掃描一遍。 又有兩個數字要找,那就只能一個從頭向后找 一個從后向前找 初始把大值設為最后一個數, 小值設為第一個數,如果數字和大於和,則減小大數的數值, 反之增大小數字的數值。 收縮直至數字相遇或者找到合適解。
/* 第 14 題(數組): 題目:輸入一個已經按升序排序過的數組和一個數字, 在數組中查找兩個數,使得它們的和正好是輸入的那個數字。 要求時間復雜度是 O(n)。如果有多對數字的和等於輸入的數字,輸出任意一對即可。 例如輸入數組 1、2、4、7、11、15 和數字 15。由於 4+11=15,因此輸出 4 和 11。 */ #include<stdio.h> int findsum(int * in, int len, int sum) //輸入數組 數組長度 和 { int i, j; for(i = 0, j = len - 1; i < j; ) { if(in[i] + in[j] == sum) { printf("%d = %d + %d" , sum, in[i], in[j]); return 1; } else if(in[i] + in[j] < sum) { i++; } else { j--; } } printf("no answer"); return 0; } int main() { int a[20] = {1,2,4,7,11,15}; int n = 6; findsum(a, n, 15); return 0; }