和為s的兩個數字 VS 和為s的連續正數序列42

2021-07-13 17:19:23 字數 1590 閱讀 6324

題目一:輸入乙個遞增排序的陣列和乙個數字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...