編號18 四數之和

2022-06-19 19:45:10 字數 1452 閱讀 2193

題意:給定乙個包含 n 個整數的陣列 nums 和乙個目標值 target,判斷 nums 中是否存在四個元素 a,b,c 和 d ,使得 a + b + c + d 的值與 target 相等?找出所有滿足條件且不重複的四元組。

「注意:」

答案中不可以包含重複的四元組。

示例:給定陣列 nums = [1, 0, -1, 0, -2, 2],和 target = 0。

滿足要求的四元組集合為:

[ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2] ]

四數之和,和三數之和是乙個思路,都是使用雙指標法, 基本解法就是在三數之和 的基礎上再套一層for迴圈。

但是有一些細節需要注意,例如:不要判斷nums[k] > target就返回了,三數之和 可以通過nums[i] > 0就返回了,因為 0 已經是確定的數了,四數之和這道題目 target是任意值。(大家親自寫**就能感受出來)

三數之和的雙指標解法是一層for迴圈num[i]為確定值,然後迴圈內有left和right下表作為雙指標,找到nums[i] + nums[left] + nums[right] == 0。

四數之和的雙指標解法是兩層for迴圈nums[k] + nums[i]為確定值,依然是迴圈內有left和right下表作為雙指標,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情況,三數之和的時間複雜度是o(n2),四數之和的時間複雜度是o(n3) 。

那麼一樣的道理,五數之和、六數之和等等都採用這種解法。

對於三數之和雙指標法就是將原本暴力o(n3)的解法,降為o(n2)的解法,四數之和的雙指標解法就是將原本暴力o(n4)的解法,降為o(n3)的解法。

之前我們講過雜湊表的經典題目:四數相加ii,相對於本題簡單很多,因為本題是要求在乙個集合中找出四個數相加等於target,同時四元組不能重複。

而四數相加ii是四個獨立的陣列,只要找到a[i] + b[j] + c[k] + d[l] = 0就可以,不用考慮有重複的四個元素相加等於0的情況,所以相對於本題還是簡單了不少!

大家解決一下這兩道題目就能感受出來難度的差異。

//雙指標求解四數之和

public static list> foursum(int arr, int target)

for (int i = k + 1; i < arr.length; i++)

int left = i + 1;

int right = arr.length - 1;

while (right > left) else if (arr[k] + arr[i] + arr[left] + arr[right] < target) else }}

}return result;

}

18 四數之和

給定乙個含有 n 個整數的陣列 s,數列 s 中是否存在元素 a,b,c 和 d 使 a b c d target 請在陣列中找出所有滿足各元素相加等於特定值 的不重複組合。注意 解決方案集不能包含重複的四元組合。例如,給定陣列 s 1,0,1,0,2,2 並且給定 target 0。示例答案為 1...

18 四數之和

給定乙個包含 n 個整數的陣列nums和乙個目標值target,判斷nums中是否存在四個元素 a,b,c 和 d 使得 a b c d 的值與target相等?找出所有滿足條件且不重複的四元組。注意 答案中不可以包含重複的四元組。示例 給定陣列 nums 1,0,1,0,2,2 和 target ...

18 四數之和

給定乙個包含 n 個整數的陣列 nums 和乙個目標值 target,判斷 nums 中是否存在四個元素 a,b,c 和 d 使得 a b c d 的值與 target 相等?找出所有滿足條件且不重複的四元組。注意 答案中不可以包含重複的四元組。示例 給定陣列 nums 1,0,1,0,2,2 和 ...