Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
leetcode18四数之和
前文
本文为leetcode遍历相关题目,题目需要为18,主要考察遍历时对于效率的优化。
题目信息
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < n a、b、c 和 d 互不相同 nums[a] + nums[b] + nums[c] + nums[d] == target 你可以按 任意顺序 返回答案 。
解题思路
根据题目内容,本题需要在给定的数组中,找到四个数字加和为目标值。由于有四个元素一一对应会被认为是相同的一组数,因此在寻找过程中还要增加校验。处理时首先将目标数组排序,这样降低了处理重复数据时的复杂程度。而在遍历过程中,很容易想到的直接循环复杂度过高,因此这里采用双指针+双循环的方式降低复杂度。只要两个指针分别从左右两侧移动,在过程中计算是否满足目标值即可。
解题代码
public List<List<Integer>> fourSum(int[] nums, int target) {
nums = Arrays.stream(nums).sorted().toArray();
List<List<Integer>> result = new ArrayList<>();
if(nums.length < 4){
return result;
}
for (int i = 0; i < nums.length - 3; i++) {
if(i - 1 >= 0 && nums[i - 1] == nums[i]){
continue;
}
for (int j = i + 1; j < nums.length - 2; j++) {
if(j - 1 >= i + 1 && nums[j - 1] == nums[j]){
continue;
}
int p = j + 1;
int q = nums.length - 1;
while (p < q){
if(p-1>=j + 1 && nums[p - 1] == nums[p]){
p++;
continue;
}
if(q+1<=nums.length-1 && nums[q + 1] == nums[q]){
q--;
continue;
}
if(nums[i] + nums[j] + nums[p] + nums[q] == target){
List<Integer> item = new ArrayList<>();
item.add(nums[i]);
item.add(nums[j]);
item.add(nums[p]);
item.add(nums[q]);
result.add(item);
p++;
}else if(nums[i] + nums[j] + nums[p] + nums[q] == target){
p++;
}else{
q--;
}
}
}
}
return result;
}
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。