題目描述:
給定乙個包含 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]
]
解答1
類似於三數之和的問題,先對陣列排序,在固定前兩個數nums[i]和nums[j]的情況下,使用兩個指標,來尋找另外兩個數。
同時,在固定nums[i]時,通過當前可得到的最大值和最小值來和目標值進行比較,如果最小值都比目標值大,說明對所有的nums[i]都不可能會有滿足條件的,直接結束i的迴圈;如果最大值比目標值小,說明對當前nums[i]不可能滿足條件了,進入下乙個迴圈。
同理,固定nums[j]時也是同樣的處理。
接下來的處理,和三數之和相同。
class
solution
arrays.
sort
(nums)
;for
(int i=
0;i3;i++
)/*獲取當前最大值,如果最大值比目標值小,說明後面越來越小的值不需要考慮,進入下乙個迴圈*/
int max=nums[i]
+nums[len-1]
+nums[len-2]
+nums[len-3]
;if(max//第二個迴圈,固定第二個數
for(
int j=i+
1;j2;j++
)//兩個指標
int left = j+1;
int right = len-1;
/*獲取當前最小值,如果最小值比目標值大,說明後面越來越大的值不許考慮,直接結束迴圈*/
min=nums[i]
+nums[j]
+nums[j+1]
+nums[j+2]
;if(min>target)
/*獲取當前最大值,如果最大值比目標值小,說明後面越來越小不需考慮,跳出此次迴圈*/
max=nums[i]
+nums[j]
+nums[len-2]
+nums[len-1]
;if(max//使用兩個指標,left和right,left從j+1開始,right從len-1開始
//當left//nums[i],nums[j],nums[left]和nums[right]的和為sum
//如果sum>target,就將right前移,right--
//如果sum//sum等於target,先把這一組結果記錄下來
//將left++,right--
//在left//在leftwhile
(leftwhile
(left== nums[right+1]
)}else
if(sumelse right--;}
}}return ans;
}}
解答二
通過遞迴實現ksum。
將問題分解為: k等於2時,求兩數之和;k>2時,求k-1個數之和。
class
solution
private list
>
ksum
(int
nums,
int target,
int k,
int index)
//遞迴的出口,就是求兩數之和
//雙指標求兩數之和
if(k ==2)
while
(left== nums[right+1]
)}else
if(nums[left]
+nums[right]
>target)
else left++;}
}else}}
}return res;
}}
LeetCode演算法題 四數之和fourSum
給定乙個包含 n 個整數的陣列 nums 和乙個目標值 target,判斷 nums 中是否存在四個元素 a,b,c 和 d 使得 a b c d 的值與 target 相等?找出所有滿足條件且不重複的四元組。注意 答案中不可以包含重複的四元組。示例 給定陣列 nums 1,0,1,0,2,2 和 ...
演算法 兩數之和,三數之和,四數之和
給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 ...
演算法題 三數之和
題目描述 給你乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 請你找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。示例 給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 解法一...