Leetcode 两数之和
终于刷了第一道leetcode,虽然难度是简单,但做的时候还是遇到了很多问题,最后的代码也还有很多可以优化的地方,特此记录一下,跟大家一起学习!
题目描述:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值的那两个整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
C++解题代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int a = nums.size();
vector<int> sub;
for(int i=0;i<(a-1);i++)
{
for(int j=i+1;j<a;j++)
{
int sum = nums[i]+nums[j];
if(target==sum)
{
sub.push_back(i);
sub.push_back(j);
}
}
}
return sub;
}
};
题目解析:
注意题目描述中加粗的部分。
注意点如下:
- 数组内的值以及目标值皆为整数。
- 目标是寻找数组内和为目标值的两个整数,输出这两个整数在数组内的下标。具体可参考实例。
- 只考虑每种输入只对应一个答案即可,即输出结果唯一且不能是数组某一元素的自身之和。例如输入nums = [6,2,10,8], target = 12.则输出应该是[1,2],而不是[0,0].
代码解析:
leetcode上使用C++解题默认会给出如下的代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
}
};
class(类)
最开始看着有点不习惯,以为会给出int main()这种,这里给出的是一个类,最终执行的时候应该会调用这个类进行测试。
大家对类这种类型不太了解的话,可以参考菜鸟教程的内容:
Vector(向量)
在类里给出了一个返回类型是vector< int >类型的函数twosum,vector这个之前没有接触过,所以刚看到的时候非常头疼,之后在菜鸟教程以及一些优快云博客里学习了关于Vector的一些知识。在这里简单介绍一下:
Vector(向量)就是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。
我的理解就是Vector(向量)是一个长度不定且可以存储不同类型数据的数组。且Vector除了可以像数组一样访问数据,还可以通过一些特殊语句更加便捷地删除/添加数据。
关于Vector有很多很有用的操作,具体可以参考下面这篇博客:
在最终的解答中,我用到了nums.size()这个操作,意思就是返回nums中元素的个数,通过这个操作就可以知道nums中有多少个元素。后面还用到了sub.push_back(i)这个操作,即在数组的最后添加数据i。
&(引用)
之后就是twosum这个函数的输入参数,一个是int target即我们的整数目标值,另一个是vector< int >& nums,这个还蛮有意思,我的理解是传入了一个vector< int >类型的数组, 这里的&应该是引用的意思,大家可以理解为在主函数中有一个实参nums,然后此处是这个实参的复制体。引用跟指针的作用类似,但也有区别。引用跟指针的具体内容可以参考下面的博客:
实现
理解了上面的内容之后,实现起来就比较简单了,我用的方法比较简单粗暴,即将数组里的元素两两求和,使用了两个for循环来实现,然后在内层循环里直接判断和是否跟目标值target相等,若相等则将这两个下标存到另一个新的数组中,最后输出这个数组即可。
运行结果
最后执行结果如上,可以看到执行用时很拉跨,关于这道题还有很多更好的解法,评论里也有很多优秀的解答,大家可以学习参考,我也继续学习一下!