• Leetcode 1:two sum


    题目描述:

        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中,在便利的过程中进行对应差值的寻找,如果找到了就结束遍历。这样就大大减小了时间复杂度

  • 相关阅读:
    Soap 教程
    MAC mysql install
    PHP date
    MAC 终端terminal颜色
    MAC 终端颜色设置
    MAC brew软件安装
    PHP iconv函数
    Java----前端验证之验证码额实现
    Java---Ajax在Struts2框架的应用实例
    Java基础—标识符及命名规范
  • 原文地址:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/6374612.html
Copyright © 2020-2023  润新知