我只考虑数组中并未存在重复的元素
O(N) 只要把数组全部扫一遍就好了
public static int TwoSumFast2(int[] a){ // O NArrays.sort(a);int cnt=0;int left = 0, right = a.length-1;while(left<right){if(a[left]+a[right]==0){cnt++;left++;}if(a[left]+a[right]>0) right--;if(a[left]+a[right]<0) left++;}return cnt;}
3-sum和2-sum思路一致 O(N^2)
public static int ThreeSumFast2(int[] a){ // N^2 Arrays.sort(a);int N = a.length;int cnt=0;for(int i=0;i<N;i++){int left = i+1, right=a.length-1;while(left<right){if(a[left]+a[right]+a[i]==0){cnt++;left++;}if(a[left]+a[right]+a[i]>0) right--;if(a[left]+a[right]+a[i]<0) left++;}}return cnt;}