import java.util.AbstractList;
class Solution {
List<List<Integer>> _triples=null;
public List<List<Integer>> threeSum(int[] nums) {
return new AbstractList<List<Integer>>(){
public List<Integer> get(int index){
init();return _triples.get(index);
}
public int size(){
init(); return _triples.size();
}
private void init(){
if(_triples !=null)return;
final Set<List<Integer>> _triplesSet=new HashSet<List<Integer>>();
final int n=nums.length;
final Set<Integer> _seensSet=new HashSet<Integer>();
Arrays.sort(nums);//进行排序
for(int i=0;i<=n-3;i++){
int _head=nums[i];
if(_seensSet.contains(_head))continue;
_seensSet.add(_head);
int lo=i+1;
int hi=n-1;
while(lo<hi){
if(_head+nums[lo]+nums[hi]==0){
_triplesSet.add(Arrays.asList(_head,nums[lo],nums[hi]));
lo++;
hi--;
}
else if(_head+nums[lo]+nums[hi]<0) lo++;
else hi--;
}
}
_triples=new ArrayList<List<Integer>>(_triplesSet);
}
};
}
}