leetcode15.三数之和
排序+双指针法
class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result = new ArrayList<>();Arrays.sort(nums);for (int i = 0; i < nums.length; i++) {//1.如果a>0,那么因为排序后b和c都>0,那么直接剪枝返回结果if (nums[i] > 0) {return result;}//2.对a进行去重if (i > 0 && nums[i] == nums[i - 1]) {continue;}//3.双指针法定位b和cint left = i + 1, right = nums.length - 1;while (left < right) {int sum = nums[i] + nums[left] + nums[right];if (sum < 0) {//3.1三数之和小于0,那么左值针右移增加三数之和的大小left++;} else if (sum > 0) {//3.2三数之和大于0,那么右指针左移减少三数之和的大小right--;} else {//3.3三数之和等于0,那么正好就是结果result.add(Arrays.asList(nums[i], nums[left], nums[right]));//3.4保持a不变,b和c进行去重并收缩寻找下一组同样的以a起头的一组三数之和while (left < right && nums[left] == nums[left + 1]) {left++;}while (left < right && nums[right] == nums[right - 1]) {right--;}left++;right--;}}}return result;}
}