三数之和(Java、C实现)
生活随笔
收集整理的这篇文章主要介绍了
三数之和(Java、C实现)
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
题目链接
只会强行解,莫得技巧😂
改进算法(C实现):改进算法链接
暴力枚举法Java实现如下:
class Solution {public List<List<Integer>> threeSum(int[] nums) {int number=0,number0=0,number1=0;//负数、零、正数for(int i=0;i<nums.length;i++){if(nums[i]<0) number++;if(nums[i]==0) number0++;if(nums[i]>0) number1++;}int[] Fs=new int[number];//负数数组int[] Li=new int[number0];//零数组int[] Zs=new int[number1];//正数数组int m=0,n=0,k=0;//负数、零、正数for(int i=0;i<nums.length;i++){if(nums[i]<0) Fs[m++]=nums[i];//填充负数if(nums[i]==0) Li[n++]=nums[i];//填充零if(nums[i]>0) Zs[k++]=nums[i];//填充正数}int Im=0;//计数int[] newlt=new int[3*2*(k+m+1)*(k+m+1)];//最大储存长度int Js=0;//计数if(n>=3){Im++;newlt[Js++]=0;newlt[Js++]=0;newlt[Js++]=0;//零、零、零}if(n>0){//遍历正数与负数for(int i=0;i<m;i++){for(int j=0;j<k;j++){if(Fs[i]+Zs[j]==0){Im++; newlt[Js++]=0;newlt[Js++]=Fs[i];newlt[Js++]=Zs[j];//零、负、正}}}}for(int i=0;i<k;i++){//一正两负for(int j=0;j<m;j++){for(int k1=0;k1<m;k1++){if(j!=k1&&Fs[j]+Fs[k1]==-Zs[i]){Im++;newlt[Js++]=Fs[j];newlt[Js++]=Fs[k1];newlt[Js++]=Zs[i];//负、负、正}}}}for(int i=0;i<m;i++){//一负两正for(int j=0;j<k;j++){for(int k1=0;k1<k;k1++){if(j!=k1&&Zs[j]+Zs[k1]==-Fs[i]){Im++;newlt[Js++]=Fs[i];newlt[Js++]=Zs[j];newlt[Js++]=Zs[k1];//负、正、正}}}}int Js2=1;for(int i=5;i<newlt.length;i+=3){//填充集合的集合的长度if(newlt[i]==0){break;}Js2++;}int[][] renewlt=new int[Js2][3];//集合的集合int reJs=0;//计数for(int i=0;i<3*Js2;i+=3){renewlt[reJs][0]=newlt[i];renewlt[reJs][1]=newlt[i+1];renewlt[reJs][2]=newlt[i+2];reJs++;}int[][] renewlt0=new int[Js2][3];renewlt0[0]=renewlt[0];int Js3=1;for(int i=1;i<Js2;i++){boolean D=true;for(int j=0;j<Js2;j++){if(!differ(renewlt[i],renewlt0[j])){D=false;}}if(D){renewlt0[Js3++]=renewlt[i];}}int Js4=1;for(int i=1;i<Js2;i++){if(renewlt0[i][2]==0){break;}Js4++;}int[][] renewlt1=new int[Js4][3];for(int i=0;i<Js4;i++){renewlt1[i]=renewlt0[i];}List<List<Integer>> list = new ArrayList<List<Integer>>();//总listfor(int i=0;i<Js4;i++){List<Integer> columnList=new ArrayList<Integer>();//中间listfor(int j=0;j<3;j++){columnList.add(j, renewlt1[i][j]);}list.add(i,columnList);}if(Im==0){list=new ArrayList<List<Integer>>();}return list;}public static boolean differ(int[] a,int[] b){boolean Df=true;if(a[0]==b[0]&&a[1]==b[1]&&a[2]==b[2]){Df=false;}if(a[0]==b[0]&&a[1]==b[2]&&a[2]==b[1]){Df=false;}if(a[0]==b[1]&&a[1]==b[0]&&a[2]==b[2]){Df=false;}if(a[0]==b[2]&&a[1]==b[0]&&a[2]==b[1]){Df=false;}if(a[0]==b[1]&&a[1]==b[2]&&a[2]==b[0]){Df=false;}if(a[0]==b[2]&&a[1]==b[1]&&a[2]==b[0]){Df=false;}return Df;} }总结
以上是生活随笔为你收集整理的三数之和(Java、C实现)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 两数 相加
- 下一篇: Java:银行账户类