1. 程式人生 > >c++ 找陣列中兩個元素,其和等於固定值sum,並輸出

c++ 找陣列中兩個元素,其和等於固定值sum,並輸出

週二去中興面試的,筆試題做的是選擇填空,加一道程式設計題。

程式設計題求得是陣列中兩個元素,求和等於固定值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)。