18. 4Sum
class Solution { public List<List<Integer>> fourSum(int[] nums, int target) { List<List<Integer>> result = new ArrayList<>(); if(4 * nums[0] > target || 4 * nums[nums.length - 1] < target) return result; if(nums == null || nums.length < 4) return result; Arrays.sort(nums); for(int i = 0; i < nums.length - 3; i++){ if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target)break; //first candidate too large, search finished if(nums[i]+nums[nums.length-1]+nums[nums.length-2]+nums[nums.length-3]<target)continue; while( i > 0 && nums[i] == nums[i-1]) i++; for(int j = i+1; j < nums.length - 2; j++){ if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target)break; //second candidate too large if(nums[i]+nums[j]+nums[nums.length-1]+nums[nums.length-2]<target)continue; while( j>i+1 && nums[j] == nums[j-1]) j++; int n = j+1; int m = nums.length - 1; while( n < m){ int sum=nums[i]+nums[j]+nums[n]+nums[m]; if(target == sum){ result.add(Arrays.asList(nums[i], nums[j], nums[n], nums[m])); while(n < m && nums[n] == nums[n+1]) n++; while(n < m && nums[m] == nums[m-1]) m--; n++; m--; }else if( sum < target){ n++; }else{ m--; } } } } return result; } }
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] ]
4 sum
https://www.youtube.com/watch?v=4wFQdfTZdzI
Use 4 pointers
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> result = new ArrayList<>();
if(nums == null || nums.length < 4){
return result;
}
Arrays.sort(nums);
for(int i = 0; i < nums.length - 3; i++){
// deduplicate
if(i == 0 || nums[i] != nums[i-1]){
for(int j = i + 1; j < nums.length - 2; j++){
// deduplicate ????
if(j == i + 1 || nums[j] != nums[j-1]){
int begin = j + 1;
int end = nums.length - 1;
int newTarget = target - nums[i] - nums[j];
while(begin < end){
if(nums[begin] + nums[end] == newTarget){
//result.add(new ArrayList<>(){nums[i], nums[j], nums[begin], nums[end]});////
result.add(Arrays.asList(nums[i], nums[j], nums[begin], nums[end]));
while(begin < end && nums[begin] == nums[begin + 1]){
begin++;
}
while(begin < end && nums[end] == nums[end - 1]){
end--;
}
begin++;
end--;
}else if(nums[begin] + nums[end] < newTarget){
begin++;
}else{
end--;
}
}
}
}
}
}
return result;
}
}
Difference between Arrays.asList(array) and new ArrayList<Integer>(Arrays.asList(array))
posted on 2018-07-18 08:31 猪猪🐷 阅读(104) 评论(0) 收藏 举报
浙公网安备 33010602011771号