(双指针)Java 求解四数之和
Posted 南淮北安
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(双指针)Java 求解四数之和相关的知识,希望对你有一定的参考价值。
一、题目
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:答案中不可以包含重复的四元组。
二、双指针分析
该题类似:三数之和
本题也是使用双指针,关键就是在三数之和基础上再套一层 for 循环,只是一些细节问题需要注意
对于三数之和,剪枝操作当 nums[i]大于0时,没必要继续计算
但是本题 target 可以为任意值,也就是可以为负值,需要几个数相加为更小
比如:-11 =
(-1)+(-2)+(-3)+(-5)
,每一个都比target大,所以这样的剪枝操作不能添加
三、代码
class Solution
public List<List<Integer>> fourSum(int[] nums, int target)
List<List<Integer>> lists = new ArrayList<>();
List<Integer> list;
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++)
//题目中target是任意值,可能负的加负的更小
//比如:target为-6,则需要 -1,-2,-3,0 相加,而这几个均大于-6
// if(nums[i]>target)
// return lists;
//
//去重
if (i > 0 && nums[i] == nums[i - 1])
continue;
for (int j = i + 1; j < nums.length; j++)
//去重
if (j > i + 1 && nums[j] == nums[j - 1])
continue;
int left = j + 1;
int right = nums.length - 1;
while (left < right)
int sum = nums[i] + nums[j] + nums[left] + nums[right];
if (sum > target)
right--;
else if (sum < target)
left++;
else
list = Arrays.asList(nums[i],nums[j],nums[left],nums[right]);
lists.add(list);
while (left < right && nums[right] == nums[right - 1])
right--;
while (left < right && nums[left] == nums[left + 1])
left++;
left++;
right--;
return lists;
四、总结
三数之和的双指针是一层 for 循环nums[i]
为确定值,然后循环内 left 和 right 为双指针,找到 nums[i] + nums[left] + nums[right] = 0。
四数之和的双指针解法是两层 for 循环 nums[i] + nums[j]
为确定值,依然是循环内有 left 和 right 下表作为双指针,
找出 nums[i] + nums[j] + nums[left] + nums[right] = target
的情况,三数之和的时间复杂度是 O(n^2)
,四数之和的时间复杂度是 O(n^3)
那么一样的道理,五数之和、六数之和等等都采用这种解法。
以上是关于(双指针)Java 求解四数之和的主要内容,如果未能解决你的问题,请参考以下文章