两数之和等于目标值

原创 2018年04月15日 23:23:59

题目:

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数,将这两个数通过另一个数组返回。可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9,所以返回 [0, 1]

第一种方法:

使用两层for循环,如果两个数之和等于目标值,返回两个索引,这样可以把每一个数据都遍历到,但是时间复杂度为O(N^2)比较高。
代码实现:

void TwoSum(vector<int>& v1, vector<int>& v2, int key)
{
    for (int i = 0; i < v1.size(); i++)
    {
        for (int j = 0; j < v1.size(); j++)
        {
            if (v1[i] + v1[j] == key)
            {
                v2.push_back(i);
                v2.push_back(j);
                return;
            }
        }
    }
}

第二种方法:

这种方法针对于有序的数组,如果数组重元素不是升序的,需要先将他排序。
第二种方法,我们是这样的,我们先创建两个索引begin和end,分别指向数组中最小的元素和最大的元素,将这两个数加起来,如果之和等于key,俺么直接返回这两个数据的索引;如果两数之和小于key,那么begin++;如果两数之和大于key,那么end–;这样循环,直至begin和end相遇。
代码实现:

void TwoSum(vector<int>& v1, vector<int>& v2, int key)//这个必须是升序的
{
    int begin = 0;
    int end = v1.size() - 1;
    while (begin < end)
    {
        if (v1[begin] + v1[end] == key)
        {
            v2.push_back(begin);
            v2.push_back(end);
            return;
        }
        else if (v1[begin] + v1[end] < key)
            begin++;
        else
            end--;
    }
}

第三种方法:

我们先创建一个unordered_map,假设题目给的数组是v1,我们用key减去v1[0],如果得到的结果在map中,那说明我们找到了题目要求的两个数,如果得到的结果不在map中,我们把v1[0]和它的索引一起插入map中。循环下去,就可以得到结果了。
因为在哈希中查找的效率是O(1)是非常高的,这样我们就可以以较高的效率完成这道题了。
代码实现:

void TwoSum(vector<int>& v1, vector<int>& v2, int key)
{   //哈希, 下标i作为value传入
    unordered_map<int, int> m;
    for (int i = 0; i < v1.size(); i++)
    {
        unordered_map<int, int>::iterator it = m.find(key - v1[i]);
                                        //没找到返回end(),找到了返回数据对应的迭代器
        if (it != m.end())//找到了
        {
            v2.push_back(m[key - v1[i]]);
            v2.push_back(i);    
        }
        else//没找到插入
            m.insert({ v1[i], i });
    }
}

测试程序及运行结果:
这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wei_cheng18/article/details/79955045

LeetCode 之 two Sum寻找两个相加之和为给定值的两个数

题目 Given an array of integers, find two numbers such thatthey add up to a specific target number....
  • linfeng24
  • linfeng24
  • 2014-07-27 19:48:14
  • 1101

Lettcode | Two Sum(两个数的和等于定值)

题目: Given an array of integers, find two numbers such that they add up to a specific target...
  • a45872055555
  • a45872055555
  • 2014-07-03 17:44:04
  • 852

LeetCode之两数之和

题目描述: You are given two non-empty linked lists representing two non-negative integers. The digi...
  • tenPageBook
  • tenPageBook
  • 2017-10-30 22:18:12
  • 66

LintCode-两数之和

题目描述: 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范...
  • yaomf
  • yaomf
  • 2017-06-02 17:10:18
  • 810

两个数之和等于目标数

class Solution { public:     struct Node     {         int val;         int index;         Nod...
  • tangyifei1991
  • tangyifei1991
  • 2014-01-19 11:05:45
  • 305

Leetcode001--两数之和为指定数

在一个数组中找到两个元素,当这两个元素的和和目标值相等的话,就将这两个目标元素的的index返回...
  • jinhuoxingkong
  • jinhuoxingkong
  • 2016-09-18 12:40:50
  • 421

JavaScript实现——两数之和

题目 给定整数的一个数组,找出这样的两个数,他们的加和等于一个特定的目标数字(target)。 输入:numbers={2,7,11,15},target=9 输出:index=1,index=...
  • liyuxing6639801
  • liyuxing6639801
  • 2018-01-30 11:09:12
  • 84

【JavaScript】找出数组中两数之和为指定值的所有整数对

笔试的时候刚好做到这道题:定一个整型数组(数组中的元素可重复,已排序),以及一个指定的值。找出数组中两数之和为指定值的所有整数对,要求时间复杂度为O(N)。      首先来分析一下这个题,假设题目没...
  • u010297791
  • u010297791
  • 2017-04-19 17:00:56
  • 678

算法练习:两数之和

题目:给定一个整型数组,是否能找出两个数使其和为指定的某个值?注:整型数组中不存在相同的数。...
  • s634772208
  • s634772208
  • 2015-06-06 15:22:47
  • 1425

LintCode(56) 两数之和

题目 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 1 到 ...
  • fly_yr
  • fly_yr
  • 2016-05-31 10:32:23
  • 1695
收藏助手
不良信息举报
您举报文章:两数之和等于目标值
举报原因:
原因补充:

(最多只允许输入30个字)