Two-Sum题目描述:问题分析:C++代码示例 题目描述: 问题分析: C++代码示例

题目描述:

给定一个由整数组成的数组,返回数组中相加后能得到一个特定值(target)的两个数的索引。 假定每组输入只有一个精确的解,并且一个数只能使用一次。

问题分析:

可以先将数组存入C++ 的容器map(数组的值做key, 索引做value)中,然后从头开始遍历,由给定的target值减去每一个数(a)来获得对应的另一个数(b)的值,再用map判断这个数(b)是否在map中。如果在,取得其索引即可。由map的性质可知,如果遇到两个key相同的情况,则会用新的值来取代原来key对应的值,所以存储在map中与eky对应的值是最后出现的key的索引。根据题目描述,只可能出现一种所求的两个数的数值相等的情况,就是target是个偶数,而所求的两个数正好是target的1/2。这种情况需要单独讨论,因为map的一个key只能对应一个value。从头开始往后遍历数组,遍历到一个数等于target的1/2的时候,用map求一个这个数值对应的索引并且与这个数的索引比较,如果二者不相等,则证明数组中有两个1/2 target.

C++代码示例

[1] Two Sum

https://leetcode.com/problems/two-sum

Easy (33.09%) Total Accepted: Total Submissions: Testcase Example: ‘[3,2,4]n6’

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, and you may not use the same element twice.

Example: Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].

#include <vector>
#include <map>
using namespace std;

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        auto length = nums.size();
        map<int, int> index;

        int first = -1;
        int second = -1;

        for(int i = 0; i < length; ++i) {
            index[nums[i]] = i;
        }

        for (int i = 0; i < length; ++i) {
            if(nums[i] == target*1.0/2 
                    && index[nums[i] != i]) {
                first = i;
                second = index[nums[i]];
                break;
            }
            if (index.count(target-nums[i]) != 0 
                    && (index[target-nums[i]] > i)) {
                first = i;
                second = index[target-nums[i]];
            }
        }

        vector<int> result;
        if (first != second) {
            result.push_back(first);
            result.push_back(second);
        }
        return result;
    }

};