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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

快速寻找满足条件的两个数

發(fā)布時(shí)間:2025/4/16 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快速寻找满足条件的两个数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ?能否快速的在數(shù)組中找到兩個(gè)數(shù),讓這兩個(gè)數(shù)之和等于一個(gè)給定的數(shù)字。


解法1、

一個(gè)直接的解法就是窮舉:從數(shù)組中任意取出兩個(gè)數(shù)字,計(jì)算兩者之和是否為
給定的數(shù)字。?
顯然其時(shí)間復(fù)雜度為N(n-1)/2即O(N^2)。這個(gè)算法很簡單,寫起來也很容
易,但是效率不高。一般在程序設(shè)計(jì)里面,要盡可能降低算法的時(shí)間和空間復(fù)雜度,
所以需要繼續(xù)尋找效率更高的解法。

vector<double> mindifference(double arr[], int n, int num) {vector<double>result;for (int i = 0; i < n; i++){for (int j = i + 1; j < n; j++){if (arr[i] + arr[j] == num){result.push_back(arr[i]);result.push_back(arr[j]);break;}}}return result; }

解法二?
求兩個(gè)數(shù)字之和,假設(shè)給定的和為Sum。一個(gè)變通的思路,就是對(duì)數(shù)組中的每個(gè)
數(shù)字arr[i]都判別Sum-arr[i]是否在數(shù)組中,這樣,就變通成為一個(gè)查找的算法。


vector<double> mindifference(double arr[], int n, int num) {int index;vector<double>result;for (int i = 0; i < n; i++){index = arr.find(num - arr[i]);if (index != NULL){result.push_back(arr[i]);result.push_back(arr[index]);break;}}return result; }
解法三?
還可以換個(gè)角度來考慮問題,假設(shè)已經(jīng)有了這個(gè)數(shù)組的任意兩個(gè)元素之和的有
序數(shù)組(長為N^2)。那么利用二分查找法,只需用O(2*log2N)就可以解決這個(gè)
問題。當(dāng)然不太可能去計(jì)算這個(gè)有序數(shù)組,因?yàn)樗枰狾(N^2)的時(shí)間。但這個(gè)思
考仍啟發(fā)我們,可以直接對(duì)兩個(gè)數(shù)字的和進(jìn)行一個(gè)有序的遍歷,從而降低算法的時(shí)
間復(fù)雜度。?
首先對(duì)數(shù)組進(jìn)行排序,時(shí)間復(fù)雜度為(N*log2N)。?
然后令i = 0,j = n-1,看arr[i] + arr[j] 是否等于Sum,如果是,則結(jié)束。如果小于
Sum,則i = i + 1;如果大于大于Sum,則 j = j – 1。這樣只需要在排好序的數(shù)組上遍
歷一次,就可以得到最后的結(jié)果
,時(shí)間復(fù)雜度為O(N)。兩步加起來總的時(shí)間復(fù)雜
度O(N*log2N),下面這個(gè)程序就利用了這個(gè)思想,代碼如下所示:

for (i = 0,j=n-1; i < n; i++) {if (arr[i] + arr[j] == num){return (i, j);}else{if (arr[i] + arr[j] < sum){i++;}else{j--;}} }

總結(jié)

以上是生活随笔為你收集整理的快速寻找满足条件的两个数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。