package Basic;
import java.util.Arrays;
import java.util.Scanner;
public class TwoSumFast {
public static void main(String[] args) {
int[] a = {-1, 0, 1, 2, -1, -4};
int count = 0;
System.out.print("input target:");
Scanner scanner = new Scanner(System.in);
int target = scanner.nextInt();
Arrays.sort(a);
int i = 0,j = a.length-1;
/*for(int k = 0;k < a.length;k++){ //错误的代码 每次都从头开始扫,重复计算。也没有考虑相同的数字导致重复的情形。
while(k<a.length-1 && a[k]==a[k+1])
k++;
if(i==k)
i++;
if(j==k)
j--;
int t = target-a[k];
System.out.println("第"+k+"个作为第一个:"+"找和为"+t+"的两个数");
while(i < j){
if(a[i]+a[j] > t){
System.out.println("j是:"+j);
j--;
if(j==k)
j--;
}
else if(a[i]+a[j] < t){
System.out.println("i是:"+i);
i++;
if(i==k)
i++;
}
else{
System.out.println(t);
System.out.println("找到了一个"+"i:"+i+" j:"+j);
count++;
i++;
j--;
if(i==k)
i++;
if(j==k)
j--;
}
}
i = 0;
j = a.length-1;
}*/
for(int k = 0;k < a.length;k++){
while(k!=0 && a[k]==a[k-1]) //跳过相同的数字,只能跳过相同数字中后面的,不能跳过前面的!否则会漏掉一些情况。
k++;
i = k+1; //确保能够遍历一遍,而且不是每次都从头开始找,去掉了重复的情况,也不会把当前的k也算上
j = a.length-1;
int t = target-a[k];
while(i < j){
if(a[i] + a[j] < t)
i++;
else if(a[i] + a[j] > t)
j--;
else {
System.out.println("找到了一个"+"i:"+i+" j:"+j);
count++;
i++;
j--;
}
}
}
System.out.println(count);
}
}
3-sum问题的平方级别算法
最新推荐文章于 2021-07-13 17:22:00 发布