bigpotato

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].


    给定一个整型数组,从这个数组中找出两个数,使它们的和等于给定的数,返回这两个数的索引。
注意:
  1. 可假定每个给定的数都有且仅有一种解,即这个数组中仅有两个数的和会等于这个给定的数。
  2. 不可两次都使用数组中的同一个数。
分析:
本题可暴力破解,即遍历数组中的每一个元素,求出它(索引i)与给定数的差(记为diff),再在这个数组中从索引i+1查找是否存在数diff。代码如下:
    std::vector<int> twoSum(std::vector<int>& nums, int target) {
        std::vector<int> rst;
        int len = nums.size();
        int val = 0;
        int i = 0, j = 0;
        bool found = false;
        for (i = 0; i < len; i++)
        {
            val = target - nums[i];
            for (j = i + 1; j < len; j++)
            {
                if (val == nums[j])
                {
                    found = true;
                    break;
                }
            }
            if (found)
            {
                rst.push_back(i);
                rst.push_back(j);
                break;
            }
        }
        return rst;
    }

虽然能够得出正确的解,但该方法的弊端是显而易见的:它的复杂度为O(n2)。提交结果:112ms。应该存在更简便的方法。

可以看出,上面解法中时间主要消耗在两个for循环中,第一个for是无法避免的,但第二个for是可以去掉的,可用HashMap来代替,代码如下:

    vector<int> twoSum(vector<int>& nums, int target) {
        std::vector<int> rst;
        std::unordered_map<int, int> mp;
        int len = nums.size();
        for (int i = 0; i < len; i++)
            mp[nums[i]] = i;
        int diff = 0;
        for (int i = 0; i < len; i++)
        {
            diff = target - nums[i];
            auto iter = mp.find(diff);
            if (iter != mp.end() && iter->second != i)
            {
                rst.push_back(i);
                rst.push_back(iter->second);
                break;
            }
        }
        return rst;
    }

 提交结果:8ms!

 


posted on 2020-02-03 10:59  bigpotato  阅读(110)  评论(0)    收藏  举报