[算法练习]Two Sum

题目说明:

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution.

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

程序代码:

#include <gtest/gtest.h>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;

// 暴力遍历
vector<int> twoSum1(vector<int>& nums, int target) 
{
    vector<int> results;
    for (int i=0; i< nums.size(); ++i)
    {
        for (int j=i+1; j < nums.size(); ++j)
        {
            if (nums[i]+nums[j] == target)
            {
                results.push_back(i);
                results.push_back(j);
                break;
            }
        }
    }

    return results;
};

// 缓存映射
vector<int> twoSum2(vector<int>& nums, int target)
{
    vector<int> results;
    map<int, vector<int> > cache;
    bool find = false;

    for (unsigned int i=0; i<nums.size(); ++i)
    {    
        cache[nums[i]].push_back(i);        
    }

    for (unsigned int i=0; i<nums.size(); ++i)
    {
        map<int, vector<int> >::const_iterator it = cache.find(target-nums[i]);
        if (it != cache.end())
        {
            for (unsigned int j = 0; j< it->second.size(); ++j)
            {
                if (i != it->second[j])
                {
                    results.push_back(i);
                    results.push_back(it->second[j]);
                    find = true;
                    break;
                }
            }

            if (find)
            {
                break;
            }
        }
    }

    return results;
};

// 排序后查找
struct Node
{
    int index;
    int value;

    Node(int i, int v)
    {
        index = i;
        value = v;
    }

    bool operator < (Node& ref)
    {
        return value < ref.value;
    }
};

vector<int> twoSum(vector<int> &nums, int target) 
{
    vector<int> results;
    vector<Node> cache;

    for (int i=0; i<nums.size(); ++i)
    {
        cache.push_back(Node(i, nums[i]));
    }

    sort(cache.begin(), cache.end());

    for (int i = 0, j = cache.size() - 1; i < j;)
    {
        int value = cache[i].value + cache[j].value;
        if (value == target)
        {
            results.push_back(min(cache[i].index, cache[j].index));
            results.push_back(max(cache[i].index, cache[j].index));
            break;
        }
        else if (value > target)
        {
            --j;
        }
        else
        {
            ++i;
        }
    }
    
    return results;
};

TEST(Pratices, tTwoSum)
{
    // [3, 3, 1, 2]  3 => [0, 1]
    // [2, 7, 11, 15] 9 => [0, 1]
    // [-1, 8, 10, 12, 40, 11] 10 => [0,5]

    vector<int> data;
    data.push_back(3);
    data.push_back(3);
    data.push_back(1);    
    data.push_back(2);    
    vector<int> results =  twoSum(data,6);

    data.clear();
    data.push_back(2);
    data.push_back(7);
    data.push_back(11);
    data.push_back(15);
    results =  twoSum(data,9);

    data.clear();
    data.push_back(-1);
    data.push_back(8);
    data.push_back(10);
    data.push_back(12);
    data.push_back(40);
    data.push_back(11);
    results =  twoSum(data,10);
}
原文地址:https://www.cnblogs.com/Quincy/p/5212794.html