今天的题目是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%的用户