題意:給定乙個包含 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 和 ...