【力扣刷题】多数字相加习题方法总结

1.两数之和【哈希】

题目描述:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target  的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。

解题思路:首先拆分题目,输入:1数组/1目标值;返回值:两个/数组元素下标;条件:两个元素和为目标值/同一元素只出现一次。

拆分完题目之后想思路:需要一个数组存储这两个下标,需要对当前元素和当前元素之前的数值做记录,并求和;需要满足同一元素只出现一次。

对于遍历过的元素我们可以记录在一个固定的位置,但要保证只出现一次,并且后续方便查找所以想到hashmap。那么我们知道map中存放的是键值对,要把谁当键谁当值就是关键问题。因为我们最终要返回下标,所以应该把下标当值,把元素的数值当键来寻找是否出现过。

基于以上思路写代码。

2.三数之和【双指针】

这道题如果用我们还想要用哈希表去做的话,看上面两数相加的过程,我们要想到去重是对三个数做的去重,任务量陡增,放弃。

解题思路:因为输入的数组不一定是有序的,所以先排序,一般来说有序的数组在后续处理中都提供很多便利。那么如果要用双指针的方法的话就是计算三个位置上元素的数值和,判断与0的关系这样的思路。放置3个指针,一个用来固定第一个值,后面两个首指针和尾指针用来计算和。一首一尾两个指针遍历第一个指针之后的剩余数组。至于前面提到的已经是有序的数组,在计算过程中会提供两个便利点:1.如果和大于或者小于0,最大的数也就是尾部指针前移或者最小的数也就是首指针前移;2.对于去重的作用,因为元素已经有序排列了,我们只需要对比已经走过的位置和当前是否相等,也就是当前和当前-1是否相等就可以完成去重。

整体的解题思路就是这样,代码如下:

3.四数相加【map】

题目描述:给你四个整数数组 nums1nums2nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:0 <= i, j, k, l < n;nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

解题思路:1.四个整数数组,数据量很大,而且是四个数相加,计算过程比较复杂,应该考虑简化计算过程。这里把四个数组拆开成两部分,分别计算比如1+2和3+4中所有出现过的和以及出现的次数。

2.存储结果,有数值有次数,所以选择“键值对”即map。存放方式:因为要输出的结果也是多少个元组,输出是满足条件的个数,和之前两数之和一样key存放数值的和,value存放次数。

这样的话整道题的解题思路就又回到了两数相加这个问题。代码如下:

4.四数之和【双指针】

题目描述:给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):0 <= a, b, c, d < n,abc 和 d 互不相同,nums[a] + nums[b] + nums[c] + nums[d] == target,你可以按 任意顺序 返回答案 。

分析---输入:数组和目标值;输出:不重复的四元组;条件:和为目标值,四个元素互不相同。

解题思路:1.双指针的总体思路,但是这里是四个元素,所以要比三元素相加多一个循环。

2.去重就是和三数相加一样的思路;剪枝也就是当数值本身已经超过target就直接continue。

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mmm`

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值