java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846  
 
 
 
  
 
 此题为三数之和的衍生题,代码完全一样,只不过多了一层for循环,而多的这一层for循环,也只不过是再复制一份三数之和的for循环罢了   
🏆LeetCode15. 三数之和https://blog.csdn.net/grd_java/article/details/136010556  
 
 思路和三数之和完全一样,先排序。然后枚举数组左边界,作为第一个数 然后因为多了一个数,所以我们使用同样的代码,枚举剩余3个数的左边界,作为第二个数 然后在3个数的左边界,右边区域,使用双指针进行枚举。   
代码,时间复杂度O(n^3),空间复杂度,排序算法使用快速排序,需要O(logN)的栈空间复杂度。 
 
 
 
  
class  Solution  { public  List < List < Integer > > fourSum ( int [ ]  nums,  int  target)  { List < List < Integer > > =  new  ArrayList < List < Integer > > ( ) ; if ( nums ==  null  ||  nums. length <  4 )  return  quadruplets; Arrays . sort ( nums) ; int  length =  nums. length; for ( int  i =  0 ;  i <  length -  3 ;  i++ ) { int  x =  nums[ i] ; if ( i >  0  &&  x ==  nums[ i- 1 ] )  continue ; if ( ( long ) x +  nums[ i+ 1 ]  +  nums[ i+ 2 ]  +  nums[ i+ 3 ]  >  target)  break ; if ( ( long ) x +  nums[ length- 1 ]  +  nums[ length- 2 ]  +  nums[ length- 3 ]  <  target)  continue ; for ( int  j =  i+ 1 ;  j< length- 2 ;  j++ ) { int  y =  nums[ j] ; if ( j >  i+ 1  &&  y ==  nums[ j- 1 ] )  continue ; if ( ( long ) x +  y +  nums[ j+ 1 ]  +  nums[ j+ 2 ]  >  target)  break ; if ( ( long ) x +  y +  nums[ length- 1 ]  +  nums[ length- 2 ]  <  target)  continue ; int  left =  j +  1 ,  right =  length -  1 ; while ( left <  right) { int  z =  nums[ left] ,  t =  nums[ right] ; long  sum =  ( long ) x +  y +  z +  t; if ( sum >  target)  -- right; else  if ( sum <  target)  ++  left; else { quadruplets. add ( Arrays . asList ( x, y, z, t) ) ; for ( ++ left; left< right &&  nums[ left]  ==  nums[ left- 1 ] ;  ++ left) ; for ( -- right;  right> left &&  nums[ right]  ==  nums[ right+ 1 ] ;  -- right) ; } } } } return  quadruplets; } 
}