仅为个人记录复盘学习历程,解题思路来自代码随想录
代码随想录刷题笔记总结网址:
代码随想录
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ,找出所有满足条件且不重复的三元组。
提供参数:整数数组nums
主要操作:
对数组排序
一个for循环遍历nums,控制变量a(nums[i])
判断是否整个数组不满足条件
对a去重:当前a与上一个a相比是否相等
在for循环内定义两个指针,left=i+1;right=nums.length-1,当right>left是总是判断:
nums[i]+nums[left]+nums[right]>0,right--;
nums[i]+nums[left]+nums[right]<0,left++;
nums[i]+nums[left]+nums[right]=0,[nums[i],nums[left],nums[right]]放入结果数组,并判断left与其后是否有相同的进行去重,right与其前是否有相同的进行去重,如果没有,则:left--,right--;
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d =target ,找出所有满足条件且不重复的四元组。
提供参数:整数数组nums,整数target
主要思路:与三数之和相同使用双指针法,不过在三数之和中将a作为确定值使用双指针法,在四数之和中将a+b作为确定值使用双指针法,
主要操作:
定义一个结果数组
对数组进行排序
第一个for循环从头开始遍历nums(a=nums[i])
判断整个数组是否都不满足条件:
([-4,-3,-2,-1],target=-10,每个元素大于-10,但相加等于-10)
当nums[i]>target且nums[i]>=0时,整个数组不满足条件
对第一个数a(nums[i])进行去重:
nums[i]与nums[i-1]比较是否相等去重,与前一个比较进行去重支持第一个数与第二个数相等,与后一个数比较进行去重会导致遗漏a=b,且a+b+c+d=target的情况
第二个for循环从a后一个数(i+1)开始遍历nums(b=nums[j])
判断整个数组是否都不满足条件:
当nums[i]+nums[j]>target且nums[j]>=0时,整个数组不满足条件
(nums[i]+nums[j]>target,且后续元素数值都大于等于0时,整个数组任意四元组值大于0)
对第二个数b(nums[j])进行去重与a的去重一致
在第二个for循环内进行四元组的寻找:
定义left=j+1,right=nums.length-1,当right>left时,持续判断:
nums[i]+nums[j]+nums[left]+nums[right]>0,right--;
nums[i]+nums[j]+nums[left]+nums[right]<0,left++;
nums[i]+nums[j]+nums[left]+nums[right]=0,将[nums[i],nums[j],nums[left],nums[right]]保存到结果数组中,并判断left与其后是否有相同的进行去重,right与其前是否有相同的进行去重,如果没有,则:left--,right--;