一个人没有梦想,和咸鱼有什么分别。 -- 喜剧之王
这道题是3sum的衍生题,解题思路相似,基本没有了之前那个题的难度,不过还是要注意,四个数去重的问题。
题目
难度 中等
Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.
Note:
The solution set must not contain duplicate quadruplets.
Example:
Given array nums = [1, 0, -1, 0, -2, 2], and target = 0.
A solution set is:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
解释: 给定一个数据和一个目标整数, 寻找所有相加之和是目标整数的a, b, c, d 四数数组。
基本解题思路和15题相似,数组排序,前两个数字需要循环,后面两个数字继续采用双指针的原则查找。 注意去重的代码。
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> quadruplets = new ArrayList();
//数据排序,记得是Arrays.sort
Arrays.sort(nums);
int first = 0;
for(int i = first; i < nums.length - 3; i++){
int numOne = nums[i];
// 去掉第一个数字的重复条件
if (i > 0 && numOne == nums[i - 1]) continue;
for(int j = i+1; j < nums.length - 2; j++ ){
int numTwo = nums[j];
//去掉第二个数字的重复条件
if (j > 1 && j -1 > i && numTwo == nums[j - 1]) continue;
int targetNum = target - numOne - numTwo;
int beg = j + 1;
int end = nums.length - 1;
while (beg < end){
if(beg< end && (nums[beg] + nums[end])>targetNum) end--;
if(beg< end && (nums[beg] + nums[end])<targetNum) beg++;
if(beg< end && nums[beg] + nums[end] == targetNum){
// 去掉第三个和四个数字的重复排序
while(beg< end && nums[beg] == nums[beg + 1]) beg++;
while(beg< end && nums[end] == nums[end - 1]) end--;
int numThree = nums[beg];
int numFour = nums[end];
List<Integer> numsList = new ArrayList();
numsList.add(numOne);
numsList.add(numTwo);
numsList.add(numThree);
numsList.add(numFour);
quadruplets.add(numsList);
end--;
beg++;
}
}
}
}
return quadruplets;
}
}
时间复杂度应该是O(n^3)
image.png
网友评论