题目:
链接: link
题目解析:
方法:
代码呈现:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ret = new ArrayList<>();
//排序
Arrays.sort(nums);
//利用双指针解决问题
//asList:返回由指定数组支持的固定大小列表
int n = nums.length;
for(int i = 0; i < n;){
//固定i
if(nums[i] > 0) break;//优化
int target = -nums[i];
int left = i+1, right = n-1;
while(left < right){
int sum = nums[left] + nums[right];
if(sum > target) right--;
else if(sum < target) left++;
else {
ret.add(new ArrayList<Integer>(Arrays.asList(nums[i],nums[left],nums[right])));
//缩小区间继续寻找一>不漏:
left++;right--;
//去重left和right
while(left < right && nums[left] == nums[left-1]) left++;
while(right > left && nums[right] == nums[right+1]) right--;
}
}
//固定i也要去重:
i++;
while(i < n && nums[i] == nums[i-1]) i++;
}
return ret;
}
}