1.方法概述
(1)前期处理
三数之和用三个指针,四数之和用四个指针,最开始都要进行从小到大的排序。
(2)粗处理
编写三数之和的时候第一个指针刚开始指向所给数组的第一个元素;第二个指针记为L指针,初始指向第一个指针所指元素的下一个元素;第三个指针记为R,初始指向所给数组的最后一个元素。当这三个指针所指元素之和小于target时L向右移一位,这样就使三个元素的和变大了;当这三个指针所指元素之和大于target时L向左移一位,这样就使三个元素的和变小了;当三个元素之和等于target时就添加进要返回的数组里面。这里第一个指针要对数组中除最后两个元素的数组中的其他元素进行遍历。
编写四数之和的时候第一个指针刚开始指向所给数组的第一个元素;第二个指针刚开始指向第一个指针所指元素的下一个元素;第三个指针记为L指针,初始指向第二个指针所指元素的下一个元素;第四个指针记为R,初始指向所给数组的最后一个元素。当这四个指针所指元素之和小于target时L向右移一位,这样就使三个元素的和变大了;当这四个指针所指元素之和大于target时L向左移一位,这样就使三个元素的和变小了;当四个元素之和等于target时就添加进要返回的数组里面。这里第一个指针要对除了最后三个元素的数组中的其他元素进行遍历,第二个指针要对除了第一个和最后两个元素的数组中的其他元素进行遍历。
(3)去重处理
仅通过以上两个步骤处理后选出来的元素组合可能会有重复的,所以需要去重处理,但去重处理不是在最后才进行的,而是在上述处理过程中就进行了处理。具体方法总结为:当只有一个箭头变化的时候箭头变化前后所指的元素不能是相同的,当有多个箭头变化的时候,单个箭头变化前后所指的元素可以是相同的。
2.代码
三数求和;
class Solution:
def threeSum(self, nums):
n=len(nums)
res=[]
if(not nums or n<3):
return []
nums.sort()
res=[]
for i in range(n):
if(nums[i]>0):
return res
if(i>0 and nums[i]==nums[i-1]): #去重操作
continue
L=i+1
R=n-1
while(L<R):
if(nums[i]+nums[L]+nums[R]==0):
res.append([nums[i],nums[L],nums[R]])
while(L<R and nums[L]==nums[L+1]):#去重操作
L=L+1
while(L<R and nums[R]==nums[R-1]):#去重操作
R=R-1
L=L+1
R=R-1
elif(nums[i]+nums[L]+nums[R]>0):
R=R-1
else:
L=L+1
return res
if __name__ == '__main__':
solution = Solution()
nums = [-1,0,1,2,-1,-4]
result = solution.threeSum(nums)
print(result)
四数求和:
class Solution:
def fourSum(self, nums, target):
n = len(nums)
nums.sort()
result = []
for a in range(0, n - 3):
if a > 0 and nums[a] == nums[a - 1]:
continue
for b in range(a + 1, n - 2):
if b > a+1 and nums[b] == nums[b - 1]:#去重操作
continue
c = b + 1
d = n - 1
while d > c:
if (nums[a] + nums[b] + nums[c] + nums[d]) > target:
d = d - 1
elif nums[a] + nums[b] + nums[c] + nums[d] < target:
c = c + 1
else:
result.append([nums[a], nums[b], nums[c], nums[d]])
while c < d and nums[c+1] == nums[c]:#去重操作
c = c+1
while c < d and nums[d-1] == nums[d]:#去重操作
d = d-1
c = c+1
return result
if __name__ == '__main__':
solution = Solution()
# nums = [1, 0, -1, 0, -2, 2]
# nums = [0, 0, 0, 0]
nums = [-1, 0, 1, 2, -1, -4]
target = -1
result = solution.fourSum(nums, target)
print(result)