15. 三数之和(8,7)
15. 三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例 2:
输入:nums = []
输出:[]
示例 3:
输入:nums = [0]
输出:[]
提示:
0 <= nums.length <= 3000
-105 <= nums[i] <= 105
题解:
/**
* 基本思路,排序+双指针
* 先固定一个值,然后再遍历
*/
public List<List<Integer>> threeSum(int[] nums) {
//数组排序
Arrays.sort(nums);
//高低指针
int temp=0,low=0,high=nums.length-1;
//保存结果
List<List<Integer>> list=new ArrayList<>();
for(int i=0;i<nums.length-2;i++){
//低位指针为固定的值的后一位
low=i+1;
//过滤掉重复值
if (i > 0 && nums[i] == nums[i - 1])
continue;
//低位大于0,直接跳出
if(nums[low-1]>0)
break;
//固定2个数
temp=0-nums[i]-nums[low];
while (low<high){
if(temp==nums[high]){
List<Integer> list1=new ArrayList<>();
list1.add(nums[i]);
list1.add(nums[low]);
list1.add(nums[high]);
list.add(list1);
//这里,找到一个值之后不代表固定的值没有其他组合了,所以移动low指针继续找,但注意temp也要变
low++;
temp=0-nums[i]-nums[low];
}else if(temp>nums[high]){
//low更新,temp变
low++;
temp=0-nums[i]-nums[low];
}else {
high--;
}
}
//high指针归位,开始固定下一个值
high=nums.length-1;
}
//去重
return new ArrayList<>(new HashSet<>(list));
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。