問題一
題目
輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得他們的和正好為s,如果有多對數字的和為s,輸出任意一對即可。
例如:輸入陣列和數字15,輸出4和11。
分析
(1)最直觀的解法,時間複雜度為o(n^2)
兩個巢狀迴圈,
固定乙個數字,然後再後面找另乙個數字,看是否和為s。
(2)更快的解法,時間複雜度為o(n)
由於陣列是排序遞增的陣列,那麼找和為s的兩個數字,可以從前面找乙個小的,從後面找乙個大的。
bool findnumberswithsum(int arr, int len, int sum, int*num1, int *num2)
else
if (cursum < sum)
++begin;
else
--end;
}return
false;
}
問題二
問題
輸入乙個正數s,列印出所有和為s的連續正數序列(至少含有兩個正數)
例如輸入15,1+2+3+4+5=4+5+6=7+8 = 15
分析
這個問題,比上乙個問題,稍微難一些,但是借助上一問的思路,可以做出來。
定義兩個陣列,small和big,來作為序列的最小值和最大值。
初始化,samll = 1,big =2;
如果從small到big的序列的和大於s,那麼就從序列中去掉最小值,增大samll的值,再比較序列中的和是否大於s。迴圈,直到小於s。
如果從small到big的序列和小於s,那麼增大big,讓序列包含更多的值。
因為序列至少兩個數字,那麼small增加到 (1+s)/2。
void printsequence(int small, int big)
cout << endl;
}void findcontinuoussequence(int
sum)
++big;
cursum += big;
}}
和為s的兩個數字 VS 和為s的連續正數序列42
題目一 輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得它們的和正好是s。如果有多對數字的和等於s,輸出任意一對即可。例如輸入陣列和數字15。由於4 11 15,因此輸出4和11。解題思路 先在陣列中選擇兩個數 第乙個數和最後乙個數 如果它們的和等於輸入的s,那麼就找到了數字。如果小於s...
和為S的兩個數字VS和為s的連續正數序列
題目 輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得它們的和正好是s。如果有多對數字的和等於s,輸出任意一對即可。例如輸入陣列1 2 4 7 11 15和數字15。由於4 11 15,因此輸出4和11。思路整理一下 最初我們找到陣列的第乙個數字和最後乙個數字。首先定義兩個指標,第乙個指...
和為S的兩個數字
題目描述 輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,是的他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。輸入 每個測試案例包括兩行 第一行包含乙個整數n和k,n表示陣列中的元素個數,k表示兩數之和。其中1 n 10 6,k為int 第二行包含n個整數,每個陣列均為i...