1、题目
给定一个数组和目标值,求数组中所有相加结果等于目标值的数字组合
2、解法1
首先对数组元素排序,如果希望结果中的解没有重复的,则去除数组中重复的元素,设置两个指针从数组的两端向中间遍历,如果相加结果等于目标值,则指针所指位置即为解,如果结果大于目标值,则右指针左移,否则左指针右移;2sum的算法复杂度是O(N log N) 因为排序用了N log N以及头尾指针的搜索是线性的,所以总体是O(N log N),代码(c++)如下:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
int n;
cin >> n;
vector<int> v(n);
for(int i=0; i<n; i++)
cin >> v[i];
int target;
cin >> target;
sort(v.begin(), v.end());
//如果有重复元素,可能会出现重复解,需要去除重复解的话在这里去除数组中重复的元素
int cur=0;
for(int i=1; i<n; i++)
if(v[cur] != v[i])
v[++cur]=v[i];
n = ++cur;
//到这里,数组中已经没有重复的元素
int temp_sum;
for(int i=0, j=n-1; i<=j;){
temp_sum = v[i] + v[j];
if(temp_sum == target){//相等,i,j为一组解,输出下标
cout << v[i] << " " << v[j] << endl;
i++, j--;
}else if(temp_sum > target){//大于target,j左移
j--;
}else{//小于target,i右移
i++;
}
}
return 0;
}
3、解法2(hashmap)
可以将输入的数据存储在map中,遍历map,如果target-map[i]的值在map中存在,则存在解。时间复杂度为O(n)。
“`