演算法面試 兩數之和為S系列題目

2021-10-01 15:33:28 字數 1527 閱讀 3377

題目1:輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得它們的和正好是s。如果有多對數字的和等與s,則輸出任意一對即可。

思路:我們可以使用雙指標的思路來完成本題,第乙個指標指向陣列的第乙個(最小的)數字,第二個指標指向陣列的最後乙個(最大的)數字。如果它們的和等於輸入的s,那麼我們就已經找到了要找的兩個數字。如果小於s,我們可以考慮選擇較小的數字後面的數字。因為排在後面的數字要大一些,那麼兩個數字的和也要大一些,就有可能等於輸入的數字s了。同樣,當兩個數字的和大於輸入的數字的時候,我們可以選擇較大數字前面的數字,因為排在陣列前面的數字要小一些。

這個演算法的時間複雜度是o(n)。

接下來我們用c++**來程式設計:

bool

findnumberswithsum

(int data,

int length,

int sum,

int* num1,

int* num2)

else

if(cursum > sum)

big--

;else

small++;}

return found;

}

題目2:輸入乙個正數s,列印出所有和為s的連續正數序列(至少含有兩個數)。例如,輸入15,由於1+2+3+4+5 = 4+5+6 = 7+8 = 15,所以列印出3個連續序列1-5,4-6和7-8。

思路:有了第一題的經驗,我們也可以考慮用big和small分別表示序列的最小值和最大值。首先把small初始化為1,big初始化為2。如果從small到big的序列的和大於s,則可以從序列中去掉較小的值,也就是增大small的值。如果從small到big的序列的和小於s,則可以增大big,讓這個序列包含更多的數字。因為這個序列至少要有兩個數字,我們一直增加small到(s+1)/2為止。

接下來我們用c++來進行程式設計:

void

findcontinuoussequence

(int sum)

big++

; cursum +

=big;}}

void

printcontinuoussequence

(int small,

int big)

題目3:給定乙個整數陣列nums和乙個目標值target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。

你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。

思路:使用map和vector進行一次遍歷,時間複雜度為o(n)。

接下來我們用c++來程式設計:

class

solution

a[nums[i]

]= i;

}return b;

}}

題目 兩數之和

題目 給定乙個整數陣列nums和乙個目標值target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 ...

Leco題目 兩數之和

給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9...

演算法 兩數之和,三數之和

給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 leetcode 思路 兩層for迴圈時間複雜度是o ...