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 > > quadruplets = 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;
}
}