博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Leetcode 1:two sum
阅读量:5273 次
发布时间:2019-06-14

本文共 1449 字,大约阅读时间需要 4 分钟。

题目描述:

    Give an array of integers,return indices of 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].

  即给定一个整型数组和整数target,返回两个元素的下标,使他们满足相加的和等于target。你可以假定每个输入,都会恰好有一个满足条件的返回结果。

  分析:这道题我们首先想到的是暴力求解法,复杂度为O(n2)。

      第二个方法是hash,存储每个数对应的下标,复杂度为O(n)。

      第三个方法是先排序在夹逼,但是这道题要返回的是下标,因此这个方法行不通。

    以下是实现过程:

  方法一:暴力求解法

  class solution

{
public:
    vector<int> TwoSum(vector<int> &num, int target)
    {
        vector<int> result;
        for (int i = 0; i < num.size() - 1; ++i)
        {
            for (int j = i + 1; j < num.size(); ++j)
            {
                if (num[i] + num[j] == target)
                {
                    result.push_back(i + 1);
                    result.push_back(j + 1);
                }
            }
        }
        return result;
    }
};

  这种方法虽然很容易想到,且代码很好写,但是缺点就是时间复杂度太高。所以我们看一下另一种用hash,时间复杂度为O(n)

  方法二:

class solution

{
public:
    vector<int> TwoSum(vector<int> &num, int target)
    {
        vector<int> result;
        map<int, int> Map;
        for (int i = 0; i < num.size(); ++i)    //存储每个数对应的下标
        {
            Map[num[i]] = i;
        }
        for (int i = 0; i < num.size(); ++i)
        {
            int gap = target - num[i];
            if (Map.find(gap) != Map.end())
            {
                result.push_back(i + 1);
                result.push_back(Map[gap]+ 1);
                break;
            }
        }
        return result;
    }
};

为了降低时间复杂度,我们应该想到将逐个比较转化为直接查找,查找target与当前元素的差。而查找最快的方法是利用一个map容器存储每个元素的索引。这样取得元素索引只要常数时间即可完成。最多只需遍历一次序列,将元素及其索引加入map中,在便利的过程中进行对应差值的寻找,如果找到了就结束遍历。这样就大大减小了时间复杂度

转载于:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/6374612.html

你可能感兴趣的文章
P1192-台阶问题
查看>>
Java大数——a^b + b^a
查看>>
简单的数据库操作
查看>>
帧的最小长度 CSMA/CD
查看>>
树状数组及其他特别简单的扩展
查看>>
普通求素数和线性筛素数
查看>>
PHP截取中英文混合字符
查看>>
电子眼抓拍大解密
查看>>
51nod1076 (边双连通)
查看>>
Linux pipe函数
查看>>
java equals 小记
查看>>
2019春 软件工程实践 助教总结
查看>>
Zerver是一个C#开发的Nginx+PHP+Mysql+memcached+redis绿色集成开发环境
查看>>
程序的静态链接,动态链接和装载 (补充)
查看>>
关于本博客说明
查看>>
[Kaggle] Sentiment Analysis on Movie Reviews
查看>>
价值观
查看>>
mongodb命令----批量更改文档字段名
查看>>
国外常见互联网盈利创新模式
查看>>
android:scaleType属性
查看>>