0
点赞
收藏
分享

微信扫一扫

leetcode (力扣) 18. 四数之和 (四指针)


题目在这:​​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


举报

相关推荐

0 条评论