题目链接

关键词

{% label green 排序 %}、{% label yellow 双指针 %}

解析

  • 先不考虑去重的问题,首先最简单的做法就是三重循环,直接暴力,就可以把所有的可能都枚举出来了,但是,这样子无疑是要超时的。
  • 在暴力的基础上,考虑优化掉一重循环,因为题目要求的三数之和为0即可,所以,可以构造 双指针,也就是先固定第一个数 nums[i],然后用双指针找出 nums[j] 和 nums[k],这里假定 i < j < k
  • 既然用了双指针,就需要先给 nums 排序,来给双指针创造条件
  • 具体的做法是,让 ji + 1 开始,而让 knums.length - 1 开始,也就是从两边忘中间逼近的双指针
  • 如果对于 nums[i] + nums[j] + nums[k] >= 0, 就可以考虑缩小 [j,k] 区间,具体做法,可以参考代码
  • 对于去重,因为有序的特性,所以每次只需判断当前数是否和上一个的一样即可

代码

相似题目

Retrofit 缓存机制Architecture MVC
Loading...