3-sum问题的平方级别算法

来源:互联网 发布:2015网络神曲排行榜 编辑:程序博客网 时间:2024/05/21 22:53
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);}}

0 0
原创粉丝点击