題目描述:
給定乙個包含 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]
]
題解:
解法與三數之和相似,都是用排序+雙指標的方法,只是多了一層迴圈。
思路與演算法
最樸素的方法是使用四重迴圈列舉所有的四元組,然後使用雜湊表進行去重操作,得到不包含重複四元組的最終答案。假設陣列的長度是 nn,則該方法中,列舉的時間複雜度為 o(n4),去重操作的時間複雜度和空間複雜度也很高,因此需要換一種思路。
為了避免列舉到重複四元組,則需要保證每一重迴圈列舉到的元素不小於其上一重迴圈列舉到的元素,且在同一重迴圈中不能多次列舉到相同的元素。
為了實現上述要求,可以對陣列進行排序,並且在迴圈過程中遵循以下兩點:
每一種迴圈列舉到的下標必須大於上一重迴圈列舉到的下標;
同一重迴圈中,如果當前元素與上乙個元素相同,則跳過當前元素。
使用上述方法,可以避免列舉到重複四元組,但是由於仍使用四重迴圈,時間複雜度仍是 o(n4)。注意到陣列已經被排序,因此可以使用雙指標的方法去掉一重迴圈。
使用兩重迴圈分別列舉前兩個數,然後在兩重迴圈列舉到的數之後使用雙指標列舉剩下的兩個數。假設兩重迴圈列舉到的前兩個數分別位於下標 ii 和 jj,其中 i如果和等於 target,則將列舉到的四個數加到答案中,然後將左指標右移直到遇到不同的數,將右指標左移直到遇到不同的數;
如果和小於 target,則將左指標右移一位;
如果和大於 target,則將右指標左移一位。
使用雙指標列舉剩下的兩個數的時間複雜度是 o(n)o(n),因此總時間複雜度是 o(n3),低於 o(n4)。
具體實現時,還可以進行一些剪枝操作:
在確定第乙個數之後,如果 nums[i]+nums[i+1]+nums[i+2]+nums[i+3] > target,說明此時剩下的三個數無論取什麼值,四數之和一定大於 target,因此退出第一重迴圈;
在確定第乙個數之後,如果 nums[i]+nums[n-3]+nums[n-2]+nums[n-1] < target,說明此時剩下的三個數無論取什麼值,四數之和一定小於 target,因此第一重迴圈直接進入下一輪,列舉 nums[i+1] ;
在確定前兩個數之後,如果 nums[i]+nums[j]+nums[j+1]+nums[j+2] > target,說明此時剩下的兩個數無論取什麼值,四數之和一定大於 target,因此退出第二重迴圈;
在確定前兩個數之後,如果 nums[i]+nums[j]+nums[n-2]+nums[n-1] < target,說明此時剩下的兩個數無論取什麼值,四數之和一定小於 target,因此第二重迴圈直接進入下一輪,列舉 nums[j+1] 。
**
/**
* @param nums
* @param target
* @return
*/var
foursum
=function
(nums, target)
nums.
sort
((a, b)
=> a - b)
for(
let i =
0; i < len -
3; i ++)if
(nums[i]
+ nums[i +1]
+ nums[i +2]
+ nums[i +3]
> target)
if(nums[i]
+ nums[len -1]
+ nums[len -2]
+ nums[len -3]
< target)
for(
let j = i +
1; j < len -
2; j ++)if
(nums[i]
+ nums[j]
+ nums[j +1]
+ nums[j +2]
> target)
if(nums[i]
+ nums[j]
+ nums[len -2]
+ nums[len -1]
< target)
let left = j +
1let right = len -
1while
(left < right)
while
(nums[right]
=== nums[right +1]
)}else
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 和 ...