今天继续刷LeetCode,第18题,求4个数的和。
分析:
类似于三个数,区别是多添加一个循环。然后通过双指针法,找到满足条件的组合。
问题:
1、注意要组合不一样,这样需要判断前后是否一样、
附上C++代码:
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> re;
sort(nums.begin(),nums.end());
int len=nums.size();
for(int i=0;i<len-3;i++)
{
if(i>0&&nums[i]==nums[i-1])
continue;
for(int j=i+1;j<len-2;j++)
{
if(j>i+1&&nums[j]==nums[j-1])
continue;
int m=j+1;
int n=len-1;
while(m<n)
{
int s=nums[i]+nums[j]+nums[m]+nums[n];
if(s==target)
{
re.push_back({nums[i],nums[j],nums[m],nums[n]});
while(m<n&&nums[m]==nums[m+1])
m++;
while(m<n&&nums[n]==nums[n-1])
n--;
m++;
n--;
}
else if(s>target)
n--;
else
m++;
}
}
}
return re;
}
};
附上Python代码:
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
result = list()
nums_len = len(nums)
nums.sort()
for i in range(nums_len - 3):
if i > 0 and nums[i - 1] == nums[i]:
continue
for j in range(i+1, nums_len - 2):
if j > i + 1 and nums[j] == nums[j - 1]:
continue
l, r = j + 1, nums_len - 1
while l < r:
if nums[i] + nums[j] + nums[l] + nums[r] == target:
result.append([nums[i], nums[j], nums[l], nums[r]])
while l < r and nums[l] == nums[l + 1]:
l += 1
while l < r and nums[r] == nums[r - 1]:
r -= 1
l += 1
r -= 1
elif nums[i] + nums[j] + nums[l] + nums[r] < target:
l += 1
else:
r -= 1
return result