題目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 ...