タイトル説明:
n 個の整数の配列 nums と、ターゲット値 target が与えられます。次の条件をすべて満たし、繰り返されていない quadruples [nums[a], nums[b], nums[c], nums[d]] を見つけて返します (2 つの quadruple 要素が 1 対 1 で対応する場合、2 つの4 回転は繰り返されると見なされます):
0 <= a, b, c, d < n a、b、c 和 d 互不相同 nums[a] + nums[b] + nums[c] + nums[d] == target
回答は任意の順序で返すことができます。
例 1:
入力: nums = [1,0,-1,0,-2,2], target = 0
出力: [[-2,-1,1,2],[-2,0,0,2],[ -1,0,0,1]]例 2 :
入力: 数値 = [2,2,2,2,2]、ターゲット = 8 出力: [[2,2,2,2]]
アイデアの実現:
4 つの数と 15 の合計. 3 つの数の合計 (opens new window) は同じ考え方であり、どちらもダブル ポインター法を使用しています.
基本的な解決策は、15 に基づいて別のレイヤーを追加することです.ループの数値 (新しいウィンドウが開きます)。15. The sum of three numbers (新しいウィンドウが開きます)ダブル ポインター メソッドは、元の暴力的なO ( n 3 ) O(n^3)を変換することです。O ( n3 )解、O ( n 2 ) O(n^2)O ( n2 )ソリューション、4 つの数値の合計のダブル ポインター ソリューションは、元の暴力的なO ( n 4 ) O(n^4) をO ( n4 )O ( n 3 ) O(n^3)に還元O ( n3)解決策。
コード:
func fourSum(nums []int, target int) [][]int {
res:=[][]int{
}
lens:=len(nums)
if lens<=3{
return res
}
sort.Ints(nums)
if target>0&&nums[0]>=target{
//如果第一个大于target,不满足,
return res
}
if target<0&&nums[lens-1]<=target{
//如果第一个大于target,不满足
return res
}
for i:=0;i<lens-2;i++{
if target>0&&nums[i]>=target{
//退出条件
break
}
if i>0&&nums[i]==nums[i-1]{
//去重处理
continue
}
for j:=i+1;j<lens-1;j++{
if j!=i+1&&nums[j]==nums[j-1]{
//去重处理
continue
}
k,l:=j+1,lens-1
for k<l{
if k!=j+1&&nums[k]==nums[k-1]{
k++
continue
}
if l!=lens-1&&nums[l]==nums[l+1]{
l--
continue
}
if nums[i]+nums[j]+nums[k]+nums[l]<target{
k++
}else if nums[i]+nums[j]+nums[k]+nums[l]>target{
l--
}else {
temp:=[]int{
nums[i],nums[j],nums[k],nums[l]}
res=append(res,temp)
k++
l--
}
}
}
}
return res
}