LeetCode解析------18.四數之和-雙指針

題目:

給定一個包含 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;
    }
}

在這裏插入圖片描述

結語:
晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章