标题要求
给你一个整数数组 nums ,判定是否存在三元组 [nums, nums[j], nums[k]] 满意 i != j、i != k 且 j != k ,同时还满意 nums + nums[j] + nums[k] == 0 。请你返回全部和为 0 且不重复的三元组。
留意:答案中不可以包罗重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
表明:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
差别的三元组是 [-1,0,1] 和 [-1,-1,2] 。
留意,输出的次序和三元组的次序并不紧张。
示例 2:
输入:nums = [0,1,1]
输出:[]
表明:唯一大概的三元组和不为 0 。
示例 3:
输入:nums = [0,0,0]
输出:[[0,0,0]]
表明:唯一大概的三元组和为 0 。
提示:
- 3 <= nums.length <= 3000
- -10^5 <= nums <= 10^5
解题思绪
这道题,如果用暴力的解法,须要O(n^3) 的时间复杂度。由于标题给出的数据规模为10^5,如果直接用暴力解法肯定会超时。
标题只要求输出和为0的三元组,但是不要求保持数组的次序,以是可以考虑先对数组举行排序。
之前有一道雷同的标题,要求排序数组中,和为target的两个数。可以用双指针的方法,具体如下:
- 起首将数组从小到大肆行排序
- 将左指针指向数组头,右指针指向数组尾,计算当前的和
- 如果和大于target,则右指针往左移动,使得和变小一点
- 如果和小于target,则左指针往右移动,使得和变大一点
这道题完全可以鉴戒上面的思绪,也利用双指针的方法,只不外和的目的值target不一样。具体思绪如下:
方法时间复杂度空间复杂度双指针法O(n^2)O(1)Java代码 |