多种方式实现从数组中找到两个元素,使它们的和等于目标值

多种方式实现从数组中找到两个元素,使它们的和等于目标值

分析

通过题目我们可以得到一下几点信息:

  • 输入的数组没有说是有序的,那么就是可以认为输入的是无序数组。
  • 我们可以认为只会找到一组满足要求的解
  • 题目要求返回的是满足要求的元素的下标(不是值),所以就不要考虑排序之类会打乱数组顺序的操作了。

方法一

经过上面简单的几点分析,我们可以很容易的想到通过暴力遍历的方法解决这个问题。

方法的时间复杂度:O(n2)

空间复杂度:O(1)

暴力法的思路很简单,也很容易实现,就是找出所有可能的组合,然后把他们相加后和目标值进行比对。如果一致,那么这组就是我们要找的元素,返回这组元素的下标即可。实现代码如下:

多种方式实现从数组中找到两个元素,使它们的和等于目标值

执行结果:

多种方式实现从数组中找到两个元素,使它们的和等于目标值

方法二

暴力查找的时间复杂度是O(n2),这显然是不够理想的。两数之和的问题其实可以使用一个简单的等式来表示:

x + y = target

其中x和y就是我们要找的数。我们对这个等式变换一下,就会有如下的等式:

y = target - x

也就是说当我们确定好其中一个数时(比如x),另一个也就确定了(比如y)。

在这个问题中,我们就可以遍历一遍数组,然后判断一下满足配对要求的数是否存在于数组中就可以解决了。

其中:数组遍历的时间复杂度为O(n),判断数是否存在与数组中可以通过HASH的方式实现,时间复杂度为O(1),所以总体的时间复杂度就是O(n),由于HASH表需要进行存储,所以空间复杂度为O(n)。实现代码如下:

多种方式实现从数组中找到两个元素,使它们的和等于目标值

执行结果:

多种方式实现从数组中找到两个元素,使它们的和等于目标值

方法三

方法而中进行了两次遍历,其实我们是可以通过一次遍历就完成查找的,因为我们在构建HASH表的时候是可以同时进行判断的。具体实现代码如下图:

多种方式实现从数组中找到两个元素,使它们的和等于目标值

执行结果:

多种方式实现从数组中找到两个元素,使它们的和等于目标值


分享到:


相關文章: