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;
    }
}

在这里插入图片描述

结语:
晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值