解决2sum问题

来源:互联网 发布:腾讯云域名转入 编辑:程序博客网 时间:2024/06/06 18:36

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)。
“`

0 0
原创粉丝点击