这个题目第一眼看到的话,整理一下思路貌似不难。其实关键在于要先将数组进行排序。这个过程我们需要三个“指针”,第一个指针记录当前正在计算的元素,其余两个指针则分别记录此指针后面剩余元素的头和尾。当三个数的总和小于0(sum)时,证明数太小,那么头指针向后移动;当三个数的总和大于0(sum)时,证明数太大,尾指针向前移动;直到头尾指针相交的时候如果还不等于,那么解中肯定不包括当前正在计算的元素,将计算指针向后移动。直接上代码:
class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> array_result = new ArrayList<>();Arrays.sort(nums); //从小到大排列for (int i = 0; i < nums.length; i++) {if ((i-1) >= 0 && nums[i] == nums[i-1]) {continue;}int temp = nums[i];int pre = i+1, tail = nums.length-1; //头指针和尾指针while(tail>pre) {int result = temp + nums[pre] + nums[tail]; //正确的结果if (result == 0) {List<Integer> list = new ArrayList<>();list.add(temp);list.add(nums[pre]);list.add(nums[tail]);array_result.add(list);//防止有重复的解,且因为当前解的唯一性,所以不用移动尾指针while(pre < tail && nums[pre] == nums[pre+1]) ++pre;++pre;} else if(result < 0) {++pre;} else if(result > 0) {--tail;}}}return array_result;}
}