第一天,加油

力扣题库–两数之和

题目理解:按照题目描述,其中符合条件的应该只有一组,参考题解后学会了一下三种办法:
第一种:暴力解决法,刚开始想到的就是暴力法,因为没有基础,思维比较简单,但是其缺点是他的复杂度比较高
由于其比较简单易懂所以自己写了一下:

vector<int> ans;//用来存储结果i,j
for(int i = 0; i < nums.size(); i++){
//nums.size()是获取数组中究竟有多少个元素
	for(int j = i + 1; j < nums.size(); j++){
		if(nums[j] == target - nums[i]) {
			ans.push_back(i);
			ans.push_back(j);
			return ans;
		}
	}
return ans;
}

这种方法就是进行了两层循环将数组中的元素进行了遍历
第二种:排序后再运用双指针的方法
这种方法首先将原有的数组复制出来,因为对其进行排序后元素的顺序会发生变化,然后运用双指针的办法前后夹击,找到对应结果的元素,再运用循环的方式在原来的数组中找到相应的元素下标。在找下标的过程中注意顺序,因为有可能找到的元素下标是反过来的,所以就运用两个判断看遍历的数跟两个中的哪个相等就可以直接记录

vector<int> nums1;
vector<int> ans;
int i = 0;
int j = nums.size() - 1;
sort(nums1.begin(),nums1.end());
while(i < j){
	if(nums1[i] + nums1[j] > target) j--;
	else if(nums1[i] + nums1[j] < target) i++;
	else break;
}
for(int res = 0; res < nums.size(); res++){
	if(nums[res] == nums1[i]) ans.push_back(res);
	else if(nums[res] == nums1[j]) ans.push_back(res);
}
return ans;

这种方法就相当于把空间复杂度牺牲给时间复杂度,让运行时间大大缩短。
双指针
了解双指针也是在做题时知道的,指针可以看一个箭头,双指针我自己理解就是两个箭头指向,运用的过程中有快慢指针(可以用来判断链表中是否存在环形、计算链表的中点、找到环的起点、环的长度,求链表中的倒数第k各元素)。后边遇到题目再继续详细研究。
第三种:题解作者是运用哈希表的方法对这道题进行解算
因为我对哈希表是十分陌生的,所以打算从头理解,先达到理解这道题能自己写出来这道题的水平。
先理解unorderd_map这个关键词的定义以及用法,它相当于是新建了一个哈希表;
关于程序的写法完全参考题解,有两种
①两遍哈希
就是先把数组中的元素值与下标分别存到表中一一对应;然后再哈希表中寻找看是否有符合条件的结果值,并且这个结果值的下标值不能是与被减的下标相同

unordered_map<int,int> map;
for(int i = 0; i < nums.size(); i++){
	map[nums[i]] = i;
}
for(int j = 0; i < nums.size(); j++){
	if(map[target - nums[j]] != j){
		return {j,map[target - nums[j]]};
	}
	
}
return {};

②一遍哈希
这个方法在看题解的时候一直看不懂,一直咩搞明白为什么就定义了一次哈希表之后就直接在哈希表里是有内容了,后来发现是自己理解错了,详细在程序里说明。

unordered_map<int,int> map;
//循环是精髓,在这个循环里可以发现他有一个判断语句,首先判断一下当前选取值是否可以找到符合条件的另一个值,如果在已有的元素中没有找到相应的值那么就把这个元素以及这个元素对应的下标存入到哈希表里
//如果存在符合条件的情况的话,就是当前值对应的下标是大下标,而在已经存入哈希表中的元素对应的下标就是其中的小下标,就得到了以下程序

for(int i = 0; i < nums.size(); i++){
	if(map.find(target - nums[i]) != map.end()) return {map[target - nums[j]],j};
	map[nums[i]] = i;
}
return {};

这道题用哈希表写的话就感觉十分简洁并且运行时间会少很多,因为他的运行的复杂度降低了很多
自己还没有很深刻的体会到这类题目与哈希表之间的联系,希望以后多几道题之后有一定的收获

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值