題目一:輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得它們的和正好是s。如果有多對數字的和等於s,輸出任意一對即可。例如輸入陣列和數字15。由於4 + 11 = 15,因此輸出4和11。
解題思路:
先在陣列中選擇兩個數(第乙個數和最後乙個數),如果它們的和等於輸入的s,那麼就找到了數字。
如果小於s,由於陣列是遞增排序的,所以可以選擇將第乙個數字遞增到下乙個數字。
如果大於s,可以將最後乙個數字遞減到前乙個數字
依次不斷查詢
測試用例:
int main();
//找到的兩個數字
int num1 = 0, num2 = 0;
int s = 15;
//執行查詢和為s的兩個數字
if( findnumberswithsum(arr, 6, s, &num1, &num2) )
std::cout
<< num1 << " + "
<< num2 << " = "
<< s;
else
std::cout
<< "not found!\n";
return
0;}
函式實現:
//查詢和為s的兩個數字
bool findnumberswithsum(int data, int length, int sum, int *num1, int *num2)else
if(cursum > sum)
behind--;
else
ahead++;
}return found;
}
題目二(針對題目一的擴充套件):輸入乙個正數s,列印出所有和為s的連續正數序列(至少含有兩個數)。例如輸入15,由於1+2+3+4+5 = 4 + 5 + 6 = 7 + 8 = 15,所以結果列印出3個連續序列1~5、4~6、7~8。
解題思路:
使用small和big分別表示序列的最小值和最大值。
如果small到big的序列大於s,去掉序列中較小的值,即增大small。
如果small到big的序列小於s,去掉序列中較大的值,即增大big。
因為序列至少兩個數字,我們一直增加small到(1+s) / 2為止。
測試用例:
//測試用例
int main()
函式實現:
//列印函式
void printcontinuoussequenve(int small, int big)
//主函式
void findcontinuoussequence(int
sum)
//--否則直接增大big
big++;
cursum += big;
}}
和為s的兩個數字VS和為s的連續正數序列
問題一 題目 輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得他們的和正好為s,如果有多對數字的和為s,輸出任意一對即可。例如 輸入陣列和數字15,輸出4和11。分析 1 最直觀的解法,時間複雜度為o n 2 兩個巢狀迴圈,固定乙個數字,然後再後面找另乙個數字,看是否和為s。2 更快的解...
和為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...