日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Coding:在数组中查找具有给定总和的对

發布時間:2025/1/21 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Coding:在数组中查找具有给定总和的对 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

PS:沒事兒做做題,預防老年癡呆~

描述

給定一個未排序的整數數組,找到其中有給定總和的一對數字。
eg:
輸入:

arr = [3,5,2,9,7,6,11,0] sum = 10

輸出:
索引 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:在数组中查找具有给定总和的对的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。