两数之和 & 三数之和(数组)

两数之和

三数之和

参考:https://leetcode-cn.com/problems/3sum/solution/3sumpai-xu-shuang-zhi-zhen-yi-dong-by-jyd/

  • 暴力法解决的时间复杂度为 O ( n 3 ) O(n^3) O(n3),具体算法略。
  • 除了以上的方法,我并没有想出其他解法。于是看了其他人的笔记——使用 “双指针” ,这里进行记录。
    假设nums数组如下:
    在这里插入图片描述
    Step1、将给定的nums数组进行排序(升序)
    在这里插入图片描述
    Step2、固定三个指针中的一个指针k到索引最小处,然后另外两个指针lr分别固定在除了k指向的位置之外的最左侧与最右侧。
    在这里插入图片描述
    在这里插入图片描述
    Step3、双指针lr交替中间移动,记录对于每个固定指针k的所有满足nums[k] + nums[l] + nums[r] == 0lr组合。然而,并不是简单地直接进行算法的书写就可以了,因为我们要分析出详尽的步骤以及特殊情况:
    在这里插入图片描述

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


程序如下(Python实现):

def threeSum(nums):
    """
    :type nums: List[int]
    :rtype: List[List[int]]
    """
    nums.sort() # 原地升序排序
    result, k = [], 0 # k,l,r三个“指针”用索引来表示
    for k in range(len(nums) - 2):
    	if nums[k] > 0:
    		break
    	if k > 0 and nums[k] == nums[k-1]:
    		continue
    	l, r = k+1, len(nums) - 1
    	while l < r:
    		s = nums[k] + nums[l] + nums[r]
    		if s < 0:
    			l += 1
    			while l < r and nums[l] == nums[l-1]:
    				l += 1
    		elif s > 0:
    			r -= 1
    			while l < r and nums[r] == nums[r+1]:
    				r -= 1
    		else:
    			result.append([nums[k], nums[l], nums[r]])
    			# 因为已经得到了使和为0的三个值了,所以如果再只改变l或r都不可能再得到和为0的结果;
    			# 而正确的做法就是使r,l同时改变,同时仍进行while判断
    			l += 1
    			r -= 1
    			while l < r and nums[l] == nums[l-1]:
    				l += 1
    			while l < r and nums[r] == nums[r+1]:
    				r -= 1
    return result
print(threeSum([-1, 0, 1, 2, -1, -4]))

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值