这个题目第一眼看到的话,整理一下思路貌似不难。其实关键在于要先将数组进行排序。这个过程我们需要三个“指针”,第一个指针记录当前正在计算的元素,其余两个指针则分别记录此指针后面剩余元素的头和尾。当三个数的总和小于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;
}
}