class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result=new ArrayList<>();
//数组为null或小于3个数,返回空list
if(nums==null||nums.length<3)
return result;
//将数组排序
Arrays.sort(nums);
for(int i=0;i<nums.length-2;i++){
//说明i的数字和前一个数字相同,跳出本次循环
if(i!=0&&nums[i]==nums[i-1])
continue;
//j表示第二个数的索引
int j=i+1;
//k表示第三个数的索引,从后面开始。
int k=nums.length-1;
while(j<k){
if(nums[i]+nums[j]+nums[k]==0){
List<Integer> list=new ArrayList<Integer>();
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[k]);
result.add(list);
//因为是按照从小到大的顺序排列的,j为相应小的和k位置相应大的值加起来为0
//找一个不等于nums[j]的值,一定大于nums[j],所以要找一个小于nums[k]的值才能加起来为0
do{
j++;
}while(j<k&&nums[j]==nums[j-1]);
do{
k--;
}while(j<k&&nums[k]==nums[k+1]);
}
//小于0说明nums[j]的值太小了
else if(nums[i]+nums[j]+nums[k]<0){
j++;
}
//大于0说明nums[k]的值太大了
else{
k--;
}
}
}
return result;
}
}
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
var result=new Array();
if(nums==null||nums.length<3)
return result;
//注意在js中的sort方法是按照字母顺序进行排序的,并没有按照数值大小排序,要实现按照数值排序,必须传一个排序函数
nums.sort(sortNumber);
for(var i=0;i<nums.length;i++){
if(i!=0&&nums[i]==nums[i-1])
continue;
var j=i+1;
var k=nums.length-1;
while(j<k){
if(nums[i]+nums[j]+nums[k]==0){
var numbers=new Array();
numbers.push(nums[i]);
numbers.push(nums[j]);
numbers.push(nums[k]);
result.push(numbers);
do{
j++;
}while(j<k&&nums[j]==nums[j-1]);
do{
k--;
}while(j<k&&nums[k]==nums[k+1]);
}
else if(nums[i]+nums[j]+nums[k]<0)
j++;
else
k--;
}
}
return result;
};
function sortNumber(a,b)
{
return a - b ;
};