- タイトル
配列と特定の値mが与えられると、配列から2つの数値を見つけ、それらの合計をmにします。
- アルゴリズムのアイデア
最初の解決策は、二重ループを使用してすべての数値を列挙し、複雑度をO(n ^ 2)にすることです。
for (int i=0; i<n-1; i++)
for (int j=i+1; j<n; j++)
if (a[i]+a[j] == m)
break;
解決策2は、まず配列を並べ替え、次に配列の各要素[i]について、二分法で配列がma [i]に等しいかどうかを検出し、複雑度はO(nlogn)です。
do {
int mid = l + (r-l)/2;
if (a[mid] == x) return mid; // 遍历x为m-a[i]
else if (a[mid] > x) return r = mid-1;
else l = mid+1;
} while (l<=r);
- 解決策
#include <iostream>
using namespace std;
#define maxn 100010
int binarysearch(int a[], int size, int x) {
int l=0, r=size-1;
do {
int mid = l + (r-l)/2; // 防止溢出
if (a[mid] == x) return mid;
else if (a[mid] > x) r = mid-1;
else l = mid+1;
} while (l<=r);
return -1;
}
int main() {
int a[maxn],n, m;
cin >> n >> m;
for (int i=0; i<n; i++) // 输入数组
cin >> a[i];
for (int i=0; i<n; i++) { // 遍历搜索m-a[i]
int tmp = binarysearch(a,n,m-a[i]);
if (a[tmp] + a[i] == m && tmp != i) {
cout << i << "," << tmp << endl;
break;
}
}
return 0;
}