思路:先排序(升序),一是为了满足题目要求非降序,而是为了使用双指针。
1.一层循环+双指针。
public ArrayList<ArrayList<Integer>> threeSum(int[] num) { ArrayList<ArrayList<Integer>> res=new ArrayList<>();//用于返回 //如果数组长度小于3,直接返回空的res。 if(num.length<3){ return res; } //对sum排序 Arrays.sort(num); for(int i=0;i<num.length-2;i++){ int l=i+1;//左指针 int r=num.length-1;//右指针 while(l<r){ if(num[i]+num[l]+num[r]==0){//判断若满足条件 ArrayList tmp=new ArrayList<>(); tmp.add(num[i]); tmp.add(num[l]); tmp.add(num[r]); if(!res.contains(tmp))//判断若列表中不存在此列表 res.add(tmp);//加入到res //寻找下一个以num[i]作为第一个数值的符合条件结果 l++; r=num.length-1; }else if(num[i]+num[l]+num[r]>0){//若大于0,则指针前移 r--; }else{//若小于0,指针后移 l++; } } } return res;//返回结果 }