題目:
給定一個包含 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] ]
簡單介紹:
題目:四數之和
題目難度:中等
使用語言:JAVA。
這道題來自leetcode題庫的雙指針標籤。
解題思路:
首先看題、分析題意,我們可以明確1個關鍵點:
1.解決暴力破解的時間問題
既然,我們已經分析出來題目的關鍵任務了,下面我們就可以開始思考實現了。
我們採用算法與數據結構的思路來剖析一下這題,
數據結構:
要實現對數據的操作,我們要先明確存儲數據的數據結構。
該題的數據結構的作用:
1.設置一對雙指針分別初始指向第3個數字和最後1個數字
算法:
既然明確了我們的數據結構,我們就可以開始我們的算法分析了。
1.初始工作和數組排序。
2.遍歷數組,排除極端情況,最小值大於target和最大值小於target。
3.排除重複,保證每一次遍歷的a,b,c,d都發生改變
代碼部分:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> res=new ArrayList<>();
if(nums.length<4) return res;
Arrays.sort(nums);
int a,b,c,d;//a,b保持在最左,c,d爲雙指針
for(a=0;a<nums.length-3;a++){//a<nums.length-3,a的右側至少要存在3個數
if(a>0&&nums[a]==nums[a-1]) continue;//保證a改變
if(nums[a]+nums[a+1]+nums[a+2]+nums[a+3]>target) break;//最小值大於target
for(b=a+1;b<nums.length-2;b++){//b<nums.length-2,b的右側至少要存在2個數
if(b>a+1&&nums[b]==nums[b-1]) continue;//保證b改變
c=b+1;
d=nums.length-1;
if(nums[a]+nums[b]+nums[c]+nums[c+1]>target) break;//最小值大於target
if(nums[a]+nums[d-2]+nums[d-1]+nums[d]<target) break;//最大值小於target
while(c<d){
if(nums[a]+nums[b]+nums[c]+nums[d]<target) c++;
else if(nums[a]+nums[b]+nums[c]+nums[d]>target) d--;
else {
res.add(Arrays.asList(nums[a], nums[b], nums[c], nums[d]));
while(c<d&&nums[c]==nums[c+1]) c++;//保證c的變化
while(c<d&&nums[d]==nums[d-1]) d--;//保證d的變化
c++;
d--;
}
}
}
}
return res;
}
}
結語:
晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!