LeetCode刷题(1)--两数之和最详细解答

本篇文章将开启刷题系列,通过刷题希望自己可以积累更多解题方法。

一.前言

今天开始使用LeetCode刷题,工作之余,能够用手机刷题也是很方便的。原本以为刷题之路很轻松,但是使用了App版的LeetCode却发现有一点不太方便,第一,App版本无法提交代码,由于工作原因,公司使用内网,想要使用电脑版刷题不太方便,而将手机浏览器设置为电脑版的操作更加困难。
第二,这也是我很苦恼的一个地方,我所有写的文章,绝大部分都是我自己进行编译运行后才会演示出来,而App版却省略了测试代码,很不习惯,最重要的演示过程被App自动取代,看到很多的解题只是一段功能代码,真正的实例部分却消失不见了。更有甚者写文章时竟然也是省略的,让人只能看见其中一部分,虽然测试部分不是很难,但总让人觉得滥竽充数,如果一个功能的实现不是完整的,那么就好像看电影看到最精彩的一半戛然而止,让人猜想剩余部分,吊人胃口。

二.题目描述

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

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

三.解题思路

1.既然是整数数组,那么肯定是要创建数组的。
2.可以假设每种输入只会对应一个答案,意思是只要存在一组这样的元素就停止寻找其它元素。
3.数组中同一个元素不能使用两遍,那么数组中的重复元素只能使用一次。

第一种方法

int main()
{
	int* num;
	cout<<"请输入数组大小:"<<endl;
	int n;
	scanf("%d",&n);
	int target;
	num=(int*)malloc(sizeof(int)*n);
	cout<<"请输入数组元素:"<<endl;
	for(int i=0;i<n;i++)
	{
	   scanf("%d",&num[i]);
	}
	cout<<"请输入target值:"<<endl;
	scanf("%d",&target);
	for(int i=0;i<n-1;i++)
	{
		for(int j=i+1;j<n;j++)
		{
			if(target==num[i]+num[j])
			{
				cout<<"i="<<i<<endl;
				cout<<"j="<<j<<endl;
				break;
			}
		}
	}
}

结果:
在这里插入图片描述
这里是列举了所有符合i j的元素,但是会有重复使用元素的情况,虽然可以实现,但是不符合题目要求,我们可以定义一个新数组来存取这两个元素。
稍做补充:

for(int i=0;i<n-1;i++)
{
		for(int j=i+1;j<n;j++)
		{
			if(target==num[i]+num[j])
			{
				cout<<"i="<<i<<endl;
				cout<<"j="<<j<<endl;
				b[0]=i;
				b[1]=j;
				break;
			}
		}
}
cout<<"["<<b[0]<<","<<b[1]<<"]"<<endl;

结果:
在这里插入图片描述
只能保留最后一次符合要求的元素,虽然效果不佳,但也能符合要求,那么,能否保留一开始的元素呢?这里就要使用vector 向量容器。

向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。

上面仅仅使用数组是无法存储所有元素的,现在,我们就使用容器来将这些元素存储起来。
第二种方法
Test1.h

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

Test1.cpp

vector<int>Solution::twoSum(vector<int>& nums,int target)
{
	vector<int>add;
	int i,j;
	for(i=0;i<nums.size()-1;i++)
	{
		for(j=i+1;j<nums.size();j++)
		{
			if(nums[i]+nums[j]==target)
			{
				add.push_back(i);
				add.push_back(j);
				cout<<"["<<i<<","<<j<<"]"<<endl;
				return add;
			}
		}
	}
	return add
}
int main(){
	Solution s;
	int num[4]={1,2,2,3};
	vector<int> v(num,num+4);
	s.twoSum(v,4);
}

结果:
在这里插入图片描述
如果获取所有元素:修改部分如下,注释第一个return add

for(i=0;i<nums.size()-1;i++)
{
	for(j=i+1;j<nums.size();j++)
	{
		if(nums[i]+nums[j]==target)
		{
			add.push_back(i);
			add.push_back(j);
			cout<<"["<<i<<","<<j<<"]"<<endl;
			//return add;
		}
	}
}
return add

结果:
在这里插入图片描述
很好奇是否有存储元素到vector中,做个小小的测试

	Solution s;
	int num[4]={1,2,2,3};
	vector<int> v(num,num+4);
	vector<int> k=s.twoSum(v,4);
	cout<<k[0]<<endl;
	cout<<k[1]<<endl;
	cout<<k[2]<<endl;
	cout<<k[3]<<endl;

结果:
在这里插入图片描述
分析:将找出目标元素的容器返回后,定义一个新的vector,新的vector就是返回的容器,然后获取该容器的每一个元素,就可以获得存储的每一个值。

第二种方法的变种
Test1.h

#include<vector>
class Solution{
public:
	vector<int>twoSum(int arr[],int target,int n);
}; 

Test1.cpp

vector<int>Solution::twoSum(int arr[],int target,int n)
{
	vector<int>add;
	int i,j;
	for(i=0;i<n-1;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(arr[i]+arr[j]==target)
			{
				add.push_back(i);
				add.push_back(j);
				cout<<"["<<i<<","<<j<<"]"<<endl;
				//return add;
			}
		}
	}
	return add;
}
int main()
{
	Solution s;
	int num[4]={1,2,2,3};
	s.twoSum(num,4,4);
}

结果:
在这里插入图片描述
结果一致,这里vetcor的定义将原来的vetcor类型容器换为了直接定义数组,也是可以实现的。

	Solution s;
	int num[4]={1,2,2,3};
	vector<int> k=s.twoSum(num,4,4);
	cout<<k[0]<<endl;
	cout<<k[1]<<endl;
	cout<<k[2]<<endl;
	cout<<k[3]<<endl;

也是可以存储元素。
结果:
在这里插入图片描述

LeetCode第一题的解题思路和方法就演示到这,我相信,实例测试部分在代码中也很重要,实现过程更加重要,我们不应该因为系统便利就舍弃它们。

刷题不息,代码不止!!!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/baidu_41191295/article/details/111937516
今日推荐