LeetCode 15 三数之和
LeetCode15 三数之和
题目描述
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,
b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组
注意:答案中不可以包含重复的三元组。
样例
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
算法分析
双指针问题
-
首先经行排序,这是双指针算法的前提
-
首先枚举每个数
nums[i] -
我们的问题就变成了找
nums[l]与nums[r]使得三者之和为0 -
l从i+1向右走,r从n-1向左走 (当l变大时候r必须变小) -
判重,当
nums[i] == nums[i-1],continue即可
时间复杂度\(O(n^{2})\)
Java代码
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
int n = nums.length;
List<List<Integer>> ans = new ArrayList<List<Integer>>();
//1. 排序
Arrays.sort(nums);
for(int i = 0;i < nums.length; i++){
if(i != 0 && nums[i] == nums[i-1]) continue;
int l = i + 1;
int r = n -1;
while(l < r){
int sum = nums[i] + nums[l] + nums[r];
if(sum > 0){
r--;
continue;
}
if(sum < 0){
l ++;
continue;
}
ans.add(Arrays.asList(nums[i], nums[l], nums[r]));
do{
l++;
}while(l < r && nums[l] == nums[l-1]);
do{
r--;
}while(l < r && nums[r] == nums[r+1]);
}
}
return ans;
}
}

浙公网安备 33010602011771号