点击上方“五分钟学算法”,选择“星标”公众号web
重磅干货,第一时间送达面试
今天为你们带来三道求和问题,经过文字,图画,动图为你们解析,很容易就能读懂,每道题目都是经典题,你们快来打卡吧。算法
题目来源:leetcode 1.两数之和(简单) 15.三数之和(中等) 18.四数之和(中等)编程
两数之和
题目描述:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你能够假设每种输入只会对应一个答案。可是,数组中同一个元素不能使用两遍。
示例:数组
给定 nums = [2, 7, 11, 15], target = 9 由于 nums[0] + nums[1] = 2 + 7 = 9 因此返回 [0, 1]
题目很容易理解,即让查看数组中有没有两个数的和为目标数,若是有的话则返回两数下标,在这为你们提供两种解法双指针(暴力)法,和哈希表法,你们能够看一下。微信
哈希表法app
解析

是否是很容易理解,下面咱们来看一下题目代码。框架
题目代码:

双指针(暴力)法
解析
双指针(L,R)法的思路很简单,L指针用来指向第一个值,R指针用来从L指针的后面查找数组中是否含有和L指针指向值的和为目标值的数。见下图编辑器
例:绿指针指向的值为3,蓝指针须要在绿指针的后面遍历查找是否含有 target - 3 的元素即 5 - 3 = 2,若含有返回便可。flex

题目代码

三数之和
题目描述:
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出全部知足条件且不重复的三元组。 注意:答案中不能够包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4], 知足要求的三元组集合为:[ [-1, 0, 1], [-1, -1, 2] ]
这个题目算是对刚才题目的升级,刚才题目咱们是只需返回一个例子便可,可是这个题目是让咱们返回全部状况,这个题目咱们须要返回三个数相加为 0 的全部状况,可是咱们须要去掉重复的三元组(算是该题的核心),因此这个题目仍是挺有趣的,你们记得打卡呀。
哈希表法
解析
咱们这个题目的哈希表解法是很容易理解的,咱们首先将数组排序,排序以后咱们将排序过的元素存入哈希表中,而后咱们首先经过两层遍历,肯定好前两个数字,那么咱们只须要哈希表是否存在符合状况的第三个数字便可,跟暴力解法的思路相似,很容易理解,可是这里咱们须要注意的状况就是,例如咱们的例子为[-2 , 1 , 1],若是咱们彻底按照以上思路来的话,则会出现两个解,[-2 , 1 , 1]和[1 , 1, -2]。具体缘由为,肯定 -2,1以后发现 1 在哈希表中,存入。肯定 1 ,1 以后发现 -2 在哈希表中,存入。因此咱们须要加入一个约束避免这种状况,那就是咱们第三个数的索引大于第二个数时才存入。

上面这种状况时是不能够存入的,由于咱们虽然在哈希表中找到了符合要求的值,可是 -2 的索引为 0 小于 2 因此不能够存入。
题目代码

多指针
解析:
若是咱们将上个题目的指针解法称作是双指针的话,那么这个题目用到的方法就是三指针,由于咱们是三数之和嘛,一个指针对应一个数,下面咱们看一下具体思路,其实原理很简单,咱们先将数组排序,直接 Arrays.sort() 解决,排序以后处理起来就很容易了。下面咱们来看下三个指针的初始位置。

初始状况见上图,咱们看当前状况,三数之和为 -3 ,很显然不是 0 ,那么咱们应该怎么作呢?
咱们设想一下,咱们当前的三数之和为 -3 < 0 那么咱们若是移动橙色指针的话则会让咱们的三数之和变的更小,由于咱们的数组是有序的,因此咱们移动橙色指针(蓝色不动)时和会变小,若是移动蓝色指针(橙色不动)的话,三数之和则会变大,因此这种状况则须要向右移动咱们的蓝色指针,找到三数之和等于 0 的状况进行保存,若是三数之和大于 0 的话,则须要移动橙色指针,途中有三数之和为 0 的状况则保存。直至蓝橙两指针相遇跳出该次循环,而后咱们的绿指针右移一步,继续执行上诉步骤。可是这里咱们须要注意的一个细节就是,咱们须要去除相同三元组的状况,咱们看下面的例子。

这里咱们发现 0 - 1 + 1 = 0,当前状况是符合的,因此咱们须要存入该三元组,存入后,蓝色指针向后移动一步,橙色指针向前移动一步,咱们发现仍为 0 -1 + 1 = 0 仍然符合,可是若是继续存入该三元组的话则不符合题意,因此咱们须要去重。这里能够借助HashSet可是效率太差,不推荐。这里咱们能够使用 while 循环将蓝色指针移动到不和刚才相同的位置,也就是直接移动到元素 0 上,橙色指针一样也是。则是下面这种状况,这样咱们就实现了去重,而后继续判断当前三数之和是否为 0 。

动图解析:

题目代码:

四数之和
题目描述
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出全部知足条件且不重复的四元组。 注意: 答案中不能够包含重复的四元组。
示例:
给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。 知足要求的四元组集合为:[ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2] ]
咱们已经完成了两数之和和三数之和,这个题目应该就手到擒来了,由于咱们已经知道这类题目的解题框架,两数之和呢,咱们就先固定第一个数 ,而后移动指针去找第二个符合的,三数之和,固定一个数,双指针去找符合状况的其余两位数,那么咱们四数之和,也能够先固定两个数,而后利用双指针去找另外两位数。因此咱们来搞定他吧。
多指针:
解析:
三数之和是,咱们首先肯定一个数,而后利用双指针去找另外的两个数,咱们在这个题目里面的解题思路是须要首先肯定两个数而后利用双指针去找另外两个数,和三数之和思路基本一致很容易理解。咱们具体思路能够参考下图。
这里须要注意的是,咱们的 target 再也不和三数之和同样为 0 ,target 是不固定的,因此解题思路不能够彻底照搬上面的题目。另外这里也须要考虑去重的状况,思路和上题一致。

上图则为咱们查找到一个符合条件的四元组的状况,查找成功以后,下一步移动蓝色指针,从新定义绿蓝指针,继续执行上面步骤。

动图解析:

题目代码:

经过上面的三个例子,你们是否是把此类求和问题摸的透透的啦。
推荐阅读
• 吴师兄实名吐槽 LeetCode 上的一道题目。。。• 面试字节跳动时,我居然遇到了原题……• 计算机专业的学生怎样练习编程才能把编程学精通?• 为何 MySQL 使用 B+ 树• 一道简简单单的字节跳动算法面试题
欢迎关注个人公众号“五分钟学算法”,若是喜欢,麻烦点一下“在看”,点击左下方阅读原文,获取谷歌师兄的算法刷题笔记。

本文分享自微信公众号 - 五分钟学算法(CXYxiaowu)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。