码迷,mamicode.com
首页 > 其他好文 > 详细

1. Two Sum

时间:2020-02-03 12:04:03      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:==   red   应该   std   查找   specific   highlight   一个   使用数组   

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!

 


1. Two Sum

标签:==   red   应该   std   查找   specific   highlight   一个   使用数组   

原文地址:https://www.cnblogs.com/big-potato/p/12254866.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!