继续打卡算法题,今天学习的是LeetCode的第18题四数之和,这道题目是道中等题。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些帮助。
分析一波题目
四数之和和之前的三数之和可以使用一样的解法
先排序,再用双指针,同时需要去重
因为排序了,去重复就变得容易了。
解题的关键是需要确定4个坐标,前面两个我们通过两层循环确定,后面两个通过首尾双指针来确定。
编码解决
java
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> result = new ArrayList<>();
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
//去重复
if (i > 0 && nums[i - 1] == nums[i]) {
continue;
}
for (int j = i + 1; j < nums.length; j++) {
//去重
if (j > i + 1 && nums[j - 1] == nums[j]) {
continue;
}
int left = j + 1;
int right = nums.length - 1;
//双指针 确定后面两个坐标
while (right > left) {
int sum = nums[i] + nums[j] + nums[left] + nums[right];
if (sum > target) {
right--;
} else if (sum < target) {
left++;
} else {
result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
//去重
while (right > left && nums[right] == nums[right - 1]) right--;
//去重
while (right > left && nums[left] == nums[left + 1]) left++;
left++;
right--;
}
}
}
}
return result;
}
}
总结
双指针可以去除循环的次数,解决问题的方式更加简单高效,和3数之和一样,通过首尾的双指针法确定后面两个数字的下标。