从数组中找出一对元素,其和是一个给定的目标数字。假设数组中只存在一个符合要求的数值对,返回这些数值的下标

【解题分析】对于数组中某个下标i,如何判断它是否属于符合条件的两个数字之一?最直观的就是再次扫描数字,判断target-array【i】是否存在于数组中。这样做时间复杂度O(n^2),效率不高,原因是没有保存之前的处理结果,每次都在做重复的工作。尽管效率不高,但通过最直观的方法,发现处理当前节点需要依赖于之前的部分结果,如何保存之前的处理结果?可以使用哈希表。
既然需要回答“target-array【i】是否存在于数组中”,那不妨把值作为键,通过询问哈希表是否含有所需要的键来得到回答。最终根据题目,需要返回下标,把下标作为哈希表的值也非常自然了。
【复杂度分析】:先对数组每个元素进行上述哈希处理,再从头至尾扫描数组,判断对应的另一个数是否存在于数组中,时间复杂度O(n+n)。事实上,利用动态规划思想,仅仅利用已经处理的部分解:哈希表只存储前驱结点的信息。对于当前节点,判断前驱中是否含有对应值。当处理完当前节点,把当前节点加入哈希表,作为已经处理的部分解。这样时间复杂度可以进一步减小为O(n)。
参考代码:

vector<int> addsToTarget(vector<int> &numbers, int target)
{
    unordered_map<int, int> numToIndex;
    vector<int> vi(2);
    for(auto it=numbers.begin();it!=numbers.end();it++)
    {
        if(numToIndex.count(target-*it))
        {
            vi[0]=numToIndex[target-*it]+1;
            vi[1]=(int)(it-numbers.begin())+1;
            return vi;
        }
        numToIndex[target-*it]=(int)(it-numbers.begin());
    }
}

这里使用到一个哈希表numToIndex,它的key是vector中的数字,value是key在vector中的下标。
for循环中使用auto变量it,是遍历vector容器的迭代器,it是指向vector某元素的位置,*it是vector在it位置处的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值