题目在这:https://leetcode-cn.com/problems/4sum/
思路分析:
前两天做了三数之和,还有个最接近的三数之和。今天又来了个四数之和。明天五数之和?后天N数之和?
题目和三数之和的思路是一样的,只不过这次用了四个指针。
四个指针 k–>i–>f–>j 。
使用k指针循环遍历数组, 初始时 k在第一个 i在k后面一个 f在i后面一个 j在最后一个。
- 如果这四指针相加起来的值等于目标值,则 j往左挪动,f往右挪动。
- 如果小于,则说明需要加大,f往右挪动
- 如果大于,则说明需要减小,j往左挪动,
- 当 f<j 或者f =j时 退出本次循环,然后 i往后挪动一个位置,重置f和j的位置,继续循环。
- 当 i < j-1时,退出本次循环,k将往后挪,此时重置i的值。
上面的思路一定会看的比较蒙。
大概有这么个思路,去纸上走一遍,立马清晰~~~~~!!!!
完整代码
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
nums.sort()
print(nums)
# 四个指针
res = []
if len(nums) < 4:
return res
for k in range(len(nums)-3):
i = k + 1
j = len(nums)-1
if k !=0 and nums[k] == nums[k-1]:
continue
while i < j-1:
f = i + 1
while f < j:
s = nums[k] + nums[i] + nums[f] + nums[j]
if s == target:
res.append([nums[k] ,nums[i] ,nums[f] ,nums[j]])
f +=1
j -=1
while f < j and nums[f] == nums[f-1]:
f +=1
while f < j and nums[j] == nums[j+1]:
j -=1
elif s < target:
f +=1
while f < j and nums[f] == nums[f-1]:
f +=1
elif s > target:
j -=1
while f < j and nums[j] == nums[j+1]:
j -=1
i +=1
j = len(nums)-1
while i < j-1 and nums[i] == nums[i-1]:
i +=1
print(res)
return res```