三指针
/**
* 使用3指针
* 定义指针初始位置 以及移动优先级 end》left》first
* 移动边界处理 1 3指针值相等时 重置指针位置
* 什么时候停止移动 1 左右指针的循环移动终止于 left>=end
* 方法结束fist指针与end指针距离差小于2
*
* 特殊用例
* 0
* 000
* 3,0,-2,-1,1,2
*/
private static List<List<Integer>> productExceptSelf(int[] tree) {
Arrays.sort(tree);//排序
Set<List<Integer>> outer = new HashSet<>();
if(tree.length<3){//处理边界
return new LinkedList<>(outer);
}
//初始位置
int first=0;
int left=1;
int end=tree.length-1;
do {
int temp = tree[first] + tree[left];
while (left<end){
if(-temp==tree[end]){
//相等的时候 移动中间指针
LinkedList<Integer> inner = new LinkedList<>();
inner.add(tree[first]);
inner.add(tree[left]);
inner.add(tree[end]);
outer.add(inner);
left++;
break;
}else if (tree[end]<-temp){
left++; // 相加值大于end指针值 移动中间指针
break;
}
end--; //首先循环一定end指针
}
if(left==end){
first++;
left=first+1;
end=tree.length-1;
}
}while (end-first>2);
return new LinkedList<>(outer);
}