三数之和

    xiaoxiao2021-12-14  18

    题目:

    给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组,要求a <= b <= c,且结果不能包含重复的三元组 。

    算法:

    两数之和

    假定集合S已经排好序的话,则两数之和问题可以在O(n)的时间内解决。

    使用2个索引值first和last,分别指向第一个元素和最后一个元素,设指向的第一个元素为A,则我们的任务就是找到对应于A的元素B,B=K-A 。

    果last指向的元素小于B,则first加1,指向后面的一个元素;

    如果last指向的元素大于B,则last减1。

    这样最终一步步逼近结果,时间复杂度为O(n)。

    三数之和

    借鉴两数之和的思路,时间复杂度为O(n^2)。

    代码如下:

    public ArrayList<ArrayList<Integer>> threeSum(int[] numbers) { //HashSet保证三元组不重复 HashSet<ArrayList<Integer>> hs=new HashSet<ArrayList<Integer>>(); //先排序 Arrays.sort(numbers);//-1,-1,0,1,2,4 //再查找 int[] a=numbers; int[] b=numbers; int[] c=numbers; int i,j,k; for(k=0;k<numbers.length;k++){ i=0;//指向First j=numbers.length-1;//指向Last while(i<j && i!=k && j!=k){ if(a[i]+b[j]+c[k]>0){ j--; }else if(a[i]+b[j]+c[k]<0){ i++; }else{ ArrayList<Integer> e=new ArrayList<Integer>(); e.add(a[i]); e.add(b[j]); e.add(c[k]); Collections.sort(e); hs.add(e); i++;//向右移动 j--;//向左移动 } } } //将HashSet转化为ArrayList ArrayList<ArrayList<Integer>> three=new ArrayList<ArrayList<Integer>>(hs); return three; }

    转载请注明原文地址: https://ju.6miu.com/read-965408.html

    最新回复(0)