n数之和
n数之和
面试|2024-1-27|最后更新: 2024-3-10
type
status
date
slug
summary
tags
category
icon
password
Blocking
Blocked by
top
URL
Sub-item
Parent item
💡
总结:先进行排序(为了去重),然后采用分治法,通过循环递归将 n 个数拆解 n-1 的子问题。直到规模减少到 2,然后再直接调用求两数之和的函数,从而得到最终结果。
 
n数之和是一个经典的问题。给定一个整数数组和一个目标值,找到数组中n个数的和,使它们的和与目标值相等。如果存在这样的三元组,请输出它们的下标;否则,返回一个空列表。

两数之和

假设给定以下数组和目标和:

哈希表法

以下是使用哈希表法实现的查找函数代码:
代码实现

双指针法

以下是使用双指针法实现的查找函数代码:
代码实现

重复的两数之和

现在难度增加,数组中会出现重复的子元素。
关键难点是现在可能有多个和为 target 的数对,比如上述例子中 [1,3] 和 [3,1]就算重复,只能算一次。

哈希表法(不推荐)

哈希表法很难去重,需要在结果里进行重复查找,性能很差,所以不推荐。

双指针法

对于n数之和问题中存在重复的情况,可以使用双指针法+剪枝。
  1. 先对数组进行排序。
  1. 然后在查找过程中,如果当前元素与前一个元素相同,则跳过该元素,以避免重复。
 
时间复杂度:
  1. 排序复杂度: O(NlogN)
  1. 循环复杂度: O(N)
所以总体时间复杂度是 O(NlogN)
具体实现代码如下:
代码实现
 

多数之和

现在难度再增加,变成多数之和。例如:三数之和 四数之和
 
基本思路:
  1. 穷举,先排序(为了去重),然后循环每个元素,作为第一个数字,直到求两个数字时用twoSum函数查找。
  1. 同时需要注意为了不让第一个数重复,每次循环前要判断是否与前一个数字相同。
 
代码实现
 
 
 
 
 
四种 Observers 总结盒模型
Loading...