LeetCode 18. 四数之和(中)
三数之和的升级版,巧用三指针解决问题。
题目
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意: 答案中不可以包含重复的四元组。
示例
1 |
|
考察知识点
多指针、哈希表、双指针
核心思想
本题是三数之和的进阶题目,强烈建议您先看三数之和的 解题思路,看过之后再来看本题目,思路也就非常清晰了。
具体来说,对比三数之和最快的双指针方法,我们只需在外层在嵌套一层循环即可。这样时间复杂度将从 \(O(N^2)\) 变为\(O(N^3)\)。
有没有更快的解法? 维基百科 中提到了三数之和小于 \(O(N^2)\) 的时间复杂度的解法,因此四数之和的时间复杂度理论上可以小于 \(O(N^3)\),但是我认为有些“超纲了”,没必要掌握。
我们仍然可以在 \(O(N^3)\) 的时间复杂度内通过增加条件判断使得速度得到很大提升。主要考虑以下几点:
指针依次是 p,k,i,j
,如果 nums[p] + 3 * nums[p + 1] > target
,因为 nums
按升序排列,所以之后的数肯定都大于 target
,直接 break
;
如果 nums[p] + 3 * nums[-1] < target
,那么当前的 nums[p]
加其余三个数一定小于 target
,故 p
直接下一位即可,continue
;
k
和 p
判断完全一样,只是将 3 变成了 2,target
变成了 target - nums[p] - nums[k]
。
同样地,为了避免结果重复,某个指针遇到相同的数需要直接跳过,这与三数之和是一样的。
简单来说,就是用两层循环,把四数之和转化成二数之和。这道题目,去重是关键。
Python版本
基于题解多指针的版本
1 |
|
自己复现代码出现问题的地方
注意避免出现同样的错误了
误写
1 |
|
正解
1 |
|
误写
1 |
|
正解
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!