Problem: 18. 四数之和
解题方法
遍历第一个和第二个元素,同时防止其与上一个元素相同
双指针遍历第三个和第四个元素,减少时间复杂度
复杂度
-
时间复杂度: O ( n 3 ) O(n^3) O(n3)
-
空间复杂度: O ( 1 ) O(1) O(1)
Code
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
n = len(nums)
nums.sort()
res = []
for i in range(n - 3):
if i > 0 and nums[i] == nums[i - 1]:
continue
for j in range(i + 1, n - 2):
if j > i + 1 and nums[j] == nums[j - 1]:
continue
left = j + 1
right = n - 1
rest = target - nums[i] - nums[j]
while left < right:
if rest == nums[left] + nums[right]:
res.append([nums[i], nums[j], nums[left], nums[right]])
left += 1
while left < n and nums[left] == nums[left - 1]:
left += 1
right -= 1
while right > j + 1 and nums[right] == nums[right + 1]:
right -= 1
elif rest > nums[left] + nums[right]:
left += 1
else:
right -= 1
return res
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
Arrays.sort(nums);
int n = nums.length;
List<List<Integer>> res = new ArrayList<List<Integer>>();
for(int i = 0; i < n - 3; i++){
if(i > 0 && nums[i] == nums[i - 1]){
continue;
}
for(int j = i + 1; j < n - 2; j++){
if(j > i + 1 && nums[j] == nums[j - 1]){
continue;
}
int left = j + 1;
int right = n - 1;
long rest = (long)target - (long)nums[i] - (long)nums[j];
while(left < right){
if(rest == (long)nums[left] + (long)nums[right]){
List<Integer> k = new ArrayList<Integer>();
k.add(nums[i]);
k.add(nums[j]);
k.add(nums[left]);
k.add(nums[right]);
res.add(k);
left += 1;
right -= 1;
while(left < n && nums[left] == nums[left - 1]){
left += 1;
}
while(right > j + 1 && nums[right] == nums[right + 1]){
right -= 1;
}
}
else if(rest < nums[left] + nums[right]){
right -= 1;
}
else{
left += 1;
}
}
}
}
return res;
}
}