基础算法(Leetcode)刻意练习训练营:第四天打卡

今天的题目是15. 三数之和

这道题之前只想到暴力3层循环,后来看题解是先排序然后三指针循环查找,感觉还是挺晕的。

class Solution(object):
	def threeSum(self, nums):
		if not nums:
			return []
		# 正式处理之前,先将数组排序	
		nums = sorted(nums)
		n = len(nums)
		res = []
		# 假设数组为[0,1,2,3,4,5,6,7,8,9,10]
		# 第三个指针k最多到下标8位置,因为后面两个位置需要留给另外两个指针
		for k in range(n-2):
			# nums[k]>0,说明后面的元素肯定也大于0,最后结果肯定>0,故直接跳出
			if nums[k]>0:
				break
			# 如果当前元素和前面一个元素一样,忽略重复元素	
			if k>0 and nums[k-1]==nums[k]:
				continue
			# 定义另外两个指针 i 和 j 	
			i,j = k+1,n-1
			while i<j:
				tmp = nums[i]+nums[j]+nums[k]
				# 如果三数之和>0,说明最右边的值太大了,
				if tmp>0:
					j -= 1
					while i<j and nums[j+1]==nums[j]:
						j -= 1
				# 如果三数之和<0,说明左边的值太小了		
				elif tmp<0:
					i += 1
					while i<j and nums[i-1]==nums[i]:
						i += 1
				# 三数之和等于0,保存结果
				# 同时左指针往右移动,右指针往左移动,
				# 如果移动过程中碰到重复元素,则继续移动
				else:
					res.append([ nums[k],nums[i],nums[j] ])
					i += 1
					j -= 1
					while i<j and nums[i-1]==nums[i]:
						i += 1
					while i<j and nums[j+1]==nums[j]:
						j -= 1
		return res

结果:
执行结果:通过
显示详情
执行用时 :1344, 在所有 Python3 提交中击败了27.72%的用户
内存消耗 :16 MB, 在所有 Python3 提交中击败了93.98%的用户

然后偶然发现力扣三月有打卡活动,顺便把打卡题也做了吧:)
今天的题目是《合并有序的数组》

class Solution:
    def merge(self, A: List[int], m: int, B: List[int], n: int) -> None:
    	# 定义三个指针分别指向两个数组有效数字的元素 和2个数组有效长度之和
        ap = m - 1
        bp = n - 1
        end = m + n - 1
        # 根据2个数组有效长度定位在A数组的末尾处理位置
        for i in range(end, 0, -1):
        	# 如果两个数组指针都没到最头部:0 就进行比较
            if ap > -1 and bp > -1:
            	# 如果A的元素比较大
                if A[ap] >= B[bp]:
                	# 就把A的元素 放到尾部对应位置
                    A[i] = A[ap]
                    # A的指针前移
                    ap -= 1
                else:
                	# 否则B的元素大 放到尾部对应位置
                    A[i] = B[bp]
                    # B的指针前移
                    bp -= 1
        # 如果A的元素已移动完,B还有剩余元素则把剩余直接覆盖A的头部元素
        if bp > -1:A[0:bp + 1] = B[0:bp + 1]

执行用时 :36 ms, 在所有 Python3 提交中击败了89.15%的用户
内存消耗 :13.2 MB, 在所有 Python3 提交中击败了100.00%的用户

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值