【leetcode 刷题日记】01-两数之和

两数之和

题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

我用的是C++,因为以后想做的是游戏方向的开发,研究生实验室里做的是CV方向,所以想把C++好好学一遍(好久好久没有打代码了惭愧)。

1 暴力解法

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
for (int i = 0; i < nums.size()-1; i++)
	{
		int k = target - nums[i];
		for (int j = i+1; j < nums.size(); j++)
		{
			if (nums[j] == k)
                return  {i,j};   
		}
        
	}
	return {};
    }   
};

这里用的就是两个循环的暴力解法,提前把target-nums[i]算出来会比放进循环里更快一点。值得一提的是要考虑没有找到返回空值的情况,因为定义的是vector容器。
暴力解法的好处是思路清晰,而且j=k+1就确定了i和j是不相等的。
不过用的时间略多。
暴力解法的时间和内存

2 一层哈希

参考了题解以后,我知道了关联容器:unordered_map

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {

        unordered_map<int,int> m;
        
        for(int i=0;i<nums.size();i++)
        {
            if(m.find(target-nums[i])!=m.end())//m中存在对应的键值
                return {m[target-nums[i]],i};//因为i为较大的元素,此时添加进去的键值都还小于i,所以i在后面

            m[nums[i]]=i;  //向map中添加元素
        }
        return {};
    }
};

作者:zrita
链接:https://leetcode-cn.com/problems/two-sum/solution/c-san-chong-fang-fa-jian-dan-yi-dong-ji-bai-100-z-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

运行时间直接减到了8ms。
这里贴一下unordered_map的知识供自己后面回看。
unordered_map

3 两次哈希

还有两次哈希的解法,第一次把数据存入m中,第二次find,这里就不多做叙述。

最后希望自己坚持刷题吧,冲鸭!

发布了7 篇原创文章 · 获赞 4 · 访问量 183

猜你喜欢

转载自blog.csdn.net/fengshiyu1997/article/details/104593700
今日推荐