leetcode016 017
给一组数求 相加的0的n组数
先排序
然后确定第一个数
第二个数和第三个数从两边往中间挪
如果三数相加大于0
因为第二个数已经是最小的了
所以把第三个数往左挪
同理 小于0 第二个数往右挪
这样复杂度是O(n方)
class Solution:
# @param {integer[]} nums
# @return {integer[][]}
def threeSum(self,nums):
nums.sort()
l = len(nums)
res = []
if l < 2:
return res
i = 0
while i < l - 2:
j = i + 1
k = l - 1
while j < k:
##print i , j , k
if nums[i]+nums[k]+nums[j]>0:
k = k -1
elif nums[i]+nums[k]+nums[j]<0:
j = j + 1
else:
res.append([nums[i],nums[j],nums[k]])
while j < k and nums[j] == nums[j+1]:
j = j + 1
while j < k and nums[k] == nums[k-1]:
k = k -1
j = j + 1
k = k - 1
while i < l - 2 and nums[i] == nums[i+1]:
i = i + 1
i = i + 1
return res
17题
求一组数中三个数相加的离目标数最近的那个和
比第一题简单 同理
def threeSum(nums , target):
nums.sort()
l = len(nums)
res = nums[0]+nums[1]+nums[2]
if l < 2:
return res
i = 0
while i < l - 2:
j = i + 1
k = l - 1
while j < k:
num =nums[i]+nums[j]+nums[k]
if abs(res-target)>abs(num-target):
res = num
if nums[i]+nums[k]+nums[j]>target:
k = k -1
elif nums[i]+nums[k]+nums[j]<target:
j = j + 1
else:
while j < k and nums[j] == nums[j+1]:
j = j + 1
while j < k and nums[k] == nums[k-1]:
k = k -1
j = j + 1
k = k - 1
while i< l - 2 and nums[i] == nums[i+1]:
i = i + 1
i = i + 1
return res
###print threeSum([-1,2,1,-4],1)
贵在坚持