三数之和(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实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 两数 相加
- 下一篇: c语言 指针 数组还能这么用 ?