day07 代码随想录算法训练营 15. 三数之和
题目:15. 三数之和
我的感悟:
- 加油,我可以的。不能放弃。
理解难点:
- 双指针 思路打开
- 边界考虑
代码难点:
- 缩进问题
- continue是跳出循环条件
- 我以前分不清循环条件和判断条件。哈哈哈。一个是if 一个是while / for
总结概括:
- 只要不放弃就行!!!!!!!!
代码示例:
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
# 思路:先排序
# 逐个位置去计算,握住i,用left和right去寻找符合要求的结果
nums.sort() # 原地排序
res = []
for i in range(len(nums)):
# 1.判断异常
if nums[i] > 0: # 如果排序后,第1位就是大于0的,说明后面都是大于0的.
return res # 直接返回就可以了
# 2.去重i位置
if i>0 and nums[i] == nums[i-1]: # 从第2位开始去重
continue # 跳过本次循环
# 3.左右指针寻找满足题意的
left = i + 1
right = len(nums) -1
while left < right:
sum_ = nums[i] + nums[left] + nums[right]
if sum_ > 0: # 大了,移动后面的right
right -= 1
elif sum_ < 0: # 小了,移动前面的left
left += 1
else: #等于0 ### 下面的代码注意缩进
res.append([nums[i],nums[left],nums[right]]) # 记录值
# 对left去重
while left < right and nums[left] == nums[left+1]:
left +=1
# 对right去重
while left < right and nums[right] == nums[right-1]:
right -=1
# 找的值之后,左右也要移动,找i开头的下一组
left += 1
right -= 1
return res
通过截图:
资料:
题目链接/文章讲解/视频讲解:https://programmercarl.com/0015.%E4%B8%89%E6%95%B0%E4%B9%8B%E5%92%8C.html