Coding:在数组中查找具有给定总和的对
生活随笔
收集整理的這篇文章主要介紹了
Coding:在数组中查找具有给定总和的对
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
PS:沒事兒做做題,預防老年癡呆~
描述
給定一個未排序的整數數組,找到其中有給定總和的一對數字。
eg:
輸入:
輸出:
索引 0和4
只要找到一對數字即可。
方法一
最簡單也是最暴力的方法,用兩個循環遍歷數組,判斷兩個數字之和,如果符合條件則返回數組下標。該方法比較簡單,但是時間復雜度為O(n^2),比較高。
直接上代碼,C++實現
// 時間復雜度O(n^2) 空間復雜度 O(1) vector<int> findPair1(const vector<int> &arr,int sum) {for(int i = 0 ; i < arr.size()-1 ; ++i){for(int j = i + 1 ; j < arr.size() ; ++j){if(arr[i] + arr[j] == sum){return {i,j};}}}return {}; }int main() {vector<int> arr = {3,5,2,9,7,6,11,0};int sum = 10;auto ret = findPair1(arr,sum);if(0 == ret.size()){cout << "pair not found." << endl;}for(auto &iter : ret){cout << iter << " ";}return 0; }方法二
第二種方法借用排序來實現,首先對數據進行排序,然后定義兩個索引變量分別指向數組的頭和尾,將索引頭和尾的元素總和與期望值進行比較,如果小于期望值,則把低位索引加1,如果大于期望值,則把高位索引減1,通過循環直到低索引比高索引大,則返回。該方法時間復雜度為O(n*logn)。
上代碼
// 時間復雜度O(nlogn) 空間復雜度 O(1) vector<int> findPair2(vector<int> &arr,int sum) {std::sort(arr.begin(),arr.end());int low = 0;int high = arr.size() - 1;while(low < high){if(arr[low] + arr[high] == sum){return {low,high};}(arr[low] + arr[high] > sum) ? high--:low++;}return {}; }int main() {vector<int> arr = {3,5,2,9,7,6,11,0};int sum = 10;auto ret = findPair2(arr,sum);if(0 == ret.size()){cout << "pair not found." << endl;}for(auto &iter : ret){cout << iter << " ";}return 0; }方法三
第三種方法,可以借用map來解決,將數組的元素值和索引對應存儲在map中,通過檢查 sum-arr[i] 是否存在于map來確定想要的值。剛方法效率最高,只需要通過一次循環即可完成,所以時間復雜度為O (n).
上代碼:
// 時間復雜度O(n) 空間復雜度 O(n) vector<int> findPair3(vector<int> &arr,int sum) {std::map<int,int> tempMap;for(int i = 0 ; i < arr.size()-1 ; ++i){if(tempMap.find(sum - arr[i]) != tempMap.end()){return {tempMap[sum - arr[i]],i};}tempMap[arr[i]] = i;}return {}; }int main() {vector<int> arr = {3,5,2,9,7,6,11,0};int sum = 10;auto ret = findPair3(arr,sum);if(0 == ret.size()){cout << "pair not found." << endl;}for(auto &iter : ret){cout << iter << " ";}return 0; }該題比較簡單,主要考慮在不同的情況下其時間和空間復雜度的區別。閑來無事,就當練練手吧,保持思維的運轉,哈哈哈~
總結
以上是生活随笔為你收集整理的Coding:在数组中查找具有给定总和的对的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Coding:从给定数字集中找到最大的数
- 下一篇: C++11:move移动语义