1.两数之和【哈希】
题目描述:给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出和为目标值 target
的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。
解题思路:首先拆分题目,输入:1数组/1目标值;返回值:两个/数组元素下标;条件:两个元素和为目标值/同一元素只出现一次。
拆分完题目之后想思路:需要一个数组存储这两个下标,需要对当前元素和当前元素之前的数值做记录,并求和;需要满足同一元素只出现一次。
对于遍历过的元素我们可以记录在一个固定的位置,但要保证只出现一次,并且后续方便查找所以想到hashmap。那么我们知道map中存放的是键值对,要把谁当键谁当值就是关键问题。因为我们最终要返回下标,所以应该把下标当值,把元素的数值当键来寻找是否出现过。
基于以上思路写代码。
2.三数之和【双指针】
这道题如果用我们还想要用哈希表去做的话,看上面两数相加的过程,我们要想到去重是对三个数做的去重,任务量陡增,放弃。
解题思路:因为输入的数组不一定是有序的,所以先排序,一般来说有序的数组在后续处理中都提供很多便利。那么如果要用双指针的方法的话就是计算三个位置上元素的数值和,判断与0的关系这样的思路。放置3个指针,一个用来固定第一个值,后面两个首指针和尾指针用来计算和。一首一尾两个指针遍历第一个指针之后的剩余数组。至于前面提到的已经是有序的数组,在计算过程中会提供两个便利点:1.如果和大于或者小于0,最大的数也就是尾部指针前移或者最小的数也就是首指针前移;2.对于去重的作用,因为元素已经有序排列了,我们只需要对比已经走过的位置和当前是否相等,也就是当前和当前-1是否相等就可以完成去重。
整体的解题思路就是这样,代码如下:
3.四数相加【map】
题目描述:给你四个整数数组 nums1
、nums2
、nums3
和 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,a
、b
、c
和 d
互不相同,nums[a] + nums[b] + nums[c] + nums[d] == target,
你可以按 任意顺序 返回答案 。
分析---输入:数组和目标值;输出:不重复的四元组;条件:和为目标值,四个元素互不相同。
解题思路:1.双指针的总体思路,但是这里是四个元素,所以要比三元素相加多一个循环。
2.去重就是和三数相加一样的思路;剪枝也就是当数值本身已经超过target就直接continue。