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