c++ 找陣列中兩個元素,其和等於固定值sum,並輸出
阿新 • • 發佈:2019-01-30
週二去中興面試的,筆試題做的是選擇填空,加一道程式設計題。
程式設計題求得是陣列中兩個元素,求和等於固定值sum。
這題最簡單的方法當然是採用雙重迴圈,進行遍歷。但是這種方法的效率無疑是比較低的。複雜度是O(n^2)。
所以我就從另外一個角度進行分析:1. 先對陣列進行排序;2. 在排序陣列的基礎之上,對陣列進行遍歷。通過分步的方法,可以有效地提高效率。下面進行詳細分析。
一,首先講得是排序演算法,有很多種,當然我們要找效率最高的一種,最有效的排序演算法可以將複雜度降到O(n),但是需要O(n)的輔助空間,這種演算法在陣列很大的時候,不適合使用;另外就考慮比較好的排序演算法,如快速排序,複雜度可以降低到O(nlogn)。
二、其次就是在陣列排序之後,如何找到和為固定值sum的兩個數。通過分析,可以僅通過遍歷一次排序後的陣列,即可找到所有可能的組合。下面,上程式碼……
#include <iostream> using namespace std; int arrPartition(int arr[], int low, int high) { int pivotValue = arr[low]; while(low<high) { while(low<high && arr[high]>=pivotValue) high--; swap(arr[low],arr[high]); while(low<high && arr[low]<=pivotValue) low++; swap(arr[low],arr[high]); } return low; } void quickSort(int arr[], int low, int high) { if(low<high) { int pivotIndex = arrPartition(arr,low,high); quickSort(arr,low,pivotIndex-1); quickSort(arr,pivotIndex+1,high); } } void dualSum(int arr[], int len, int sum) { int low=0; int high=len-1; while(low<high) { while(arr[high]>=sum) { high--; } if(arr[low]+arr[high]>sum) return; else if(arr[low]+arr[high]<sum) low++; else { cout << arr[low] << " + " << arr[high] << " = " << sum << endl; high--;low++; } } } int main() { int arr[] = {5,2,7,4,21,6,14,12,11,24,26,13,30}; int arr2[] = {2,4,5,6,7,11,12,13,14,21,24,26,30}; quickSort(arr,0,12); for(int i=0;i<13;i++) cout << arr2[i] << " "; cout << endl; dualSum(arr2,13,28); dualSum(arr,13,28); return 0; }
通過對以上程式碼分析,可以計算出整個演算法的複雜度:
排序演算法的複雜度是O(nlogn),dualSum()函式的程式碼雖然有兩個while迴圈,但對陣列僅進行了一次遍歷,其複雜度為O(n)。
由此可見,複雜度為O(nlogn)。