[1] Two Sum

1. 题目描述

Given an array of integers, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based(从0开始).

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

Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2

题目中给定了一个一维数组,保存一串整型(数字可重复,但至多有两个),给定一个目标数值,从数组中找出两个数相加=目标数值,并返回两个数在数组中的位置(下标小的在前且下标从1开始)。

2. 解决方案

方案一(超时)

首先想到的方案是先选取一个值,另一个值=target-选取值,用循环的方式做,外层循环i∈[0~nums.size())确定第一个值nums[i],内层循环j∈(i~nums.size()),这样的方式虽然能做,但是最坏时间复杂度达到了n^2/2 (1+2+…+n-1),最后被判定为Time Limit Exceed。

方案二(使用stl map)

要提高效率首先想到的就是提高内层循环的查找速度,因为外层循环是必须要进行的(若大神想到什么好方法不需要遍历欢迎留言告诉我XD),增加查找速度比较方便的方法就是使用map(映射表),他的查找时间复杂度为O(logN),如下图所示,效率明显高。
log(x)和n^2/2
在这里有一点要注意,开始时先将所有数据插入到map中,值得一提的是数据有可能出现重复,如[0,1,2,0] target=0,这样的情况,map在使用insert插入时在遇到相同键值时无法修改之前的值,但是使用map[key]=value;这样的赋值方法时,键值所对应的值可以修改,所以有个小细节就是在处理时若碰上同样值插入保存后者,因为在取第一个值是我们先达到的是靠左的值,直接可以得到[1,4],所以这样可以提高效率,若保存的是后来的值则会出现输出为[4,1],这样不但效率变低,还需要将结果进行交换。

3. Coding

#include<map>
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> result(2, 0);  // 声明一个大小为2,初值都为0的一维数组
        map<int, int> numMap;  // 存储vector中的数值,加快查找速度<值,位置>
        map<int, int>::iterator it;  // 为numMap分配一个迭代器(查找用)
        // 将所有数字插入map中
        for(int m(0); m < nums.size(); ++m)
        {
            //numMap.insert(pair<int, int>(nums[m],m+1));  // 不会覆盖掉已有值
            numMap[nums[m]] = m + 1;  // 会覆盖
        }
        for(int i = 0; i < nums.size(); ++i)
        {
            result[0] = i+1;  // 左值一直往下走
            it = numMap.find(target-nums[i]);
            if(it != numMap.end()){  // 如果找到了当前值所在位置
                result[1] = (*it).second;
                if(result[0] != result[1])  // 需要有,可能出现[3,2,4],6这样的情况
                    break;
            }
        }
/*        if(result[0] > result[1])  // 如果反了交换两值
        {
            int tmp = result[0];
            result[0] = result[1];
            result[1] = tmp;
        }
*/
        return result;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值