【アルゴリズムC++】配列に2つの数の和がある数に等しいか否かを検出する


質問:配列に2つの数の和がある数に等しいかどうかを検出します.
解決方法1:まず配列を並べ替えて、それから両端から配列を巡って並べ替えた後、左端から最小値を取って、右端から最大値を取って、両者の和と目標の大きさを判断します:1.等しい場合、2つの数を出力します.2.より大きい場合、右端は2番目の数に移動し、判断を継続する.3.小さい場合は、左端を2番目の数に移動し、判断を続行します.
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

void fun1(int a[], int length, int target) {
    //      
    sort(a, a + length);
    // left    ,right    
    int left = 0, right = length - 1;
    while (left < right) {
        int tmp = a[left] + a[right];
        if (tmp == target) {
            cout << a[left] << a[right] << endl;
            return;
        }
        else if (tmp > target) { //      ,   right,     
            right--;
        }
        else {  //      ,   left,     
            left++;
        }
    }
    cout << " " << endl;
}

int main() {
    int a[] = {
        1, 3, 2, 7, 6, 9, 8, 0, 5, 4
    };

    int target = 0;
    while (cin >> target) {
        fun1(a, 10, target);
    }
}


上記の方法は簡単であるが,目標値に等しい2つの数をすべて出力できないという弊害もある.
解決方法2:暴力解法で、各数と他の数の和を1つの2次元配列に記録し、遍歴すればよい.これにより、入力配列が2 3 4 5 1であると仮定すると、すべての目標値と等しい数値対を記録することができる.
 
2
3
4
5
1
2
-
5
6
7
3
3
5
-
7
8
4
4
6
7
-
9
5
5
7
8
9
-
6
1
3
4
5
6
-
ターゲット値が7の場合,(5,2)と(3,4)は対称性を考慮してn[i][j]=n[j][i],i!=j,,従って,i>jの数値対だけでよい.
void fun2(int a[], int length, int target) {
    int** n = new int*[length];
    for (int i = 0; i < length; i++) {
        n[i] = new int[length];
    }
    for (int i = 0; i < length; i++) {
        for (int j = length - 1; j > i; j--) {
            n[i][j] = n[j][i] = a[i] + a[j];
        }
    }
    for (int i = 0; i < length; i++) {
        for (int j = length - 1; j > i; j--) {
            if (n[i][j] == target) {
                cout << a[i] << " " << a[j] << endl;
            }
        }
    }

}