3Sum
2016-07-25 17:54
239 查看
leetcode第15题,这道题是2sum的升级版,要求求3个数的和为0,而且不止一组,我的基本思路是固定一个数字,将问题转化为2sum,如何求解2sum,方法就多了,比如可以使用双指针法,或者hashmap等等,使用双指针法的时候可能会出现一个小小的问题,那就是固定一个数字的时候,满足条件的另外两个数可能不止一组,所以我最后借鉴了别人的思路改用了字典搜索,两种代码我都附上,之后再看看能不能克服这个问题。
另:原方法在外层循环做了一个重复数据的判定,速度大大提升,这主要是基于数据了。
def threeSum(nums):
# 方法一
# import copy
# def twoSum(nums,target):
# n = len(nums)
# start = 0;end = n-1
# while start < end:
# if nums[start]+nums[end] < target:
# start += 1
# elif nums[start]+nums[end] > target:
# end -= 1
# else:
# return nums[start],nums[end]
# return None,None
#
#
# n = len(nums)
# sl = sorted(nums)
# print sl
# ans = set()
# for i in range(n):
# singleAns = []
# target = 0-sl[i]
# temp = copy.deepcopy(sl)
# del temp[i]
# num1,num2 = twoSum(temp,target)
# print num1,num2
# if num1 != None and num2 != None:
# singleAns.append(sl[i])
# singleAns.append(num1)
# singleAns.append(num2)
# s = sorted(singleAns)
# addItem = tuple(s)
# ans.add(addItem)
#
#
# return map(list,ans)
# 方法二
n = len(nums)
nums.sort()
ans = set()
for index,num in enumerate(nums):
d = {}
for otherNum in nums[index+1:]:
if otherNum not in d:
d[-num-otherNum] = 1
else:
ans.add((num,-num-otherNum,-otherNum))
return map(list,ans)
另:原方法在外层循环做了一个重复数据的判定,速度大大提升,这主要是基于数据了。
def threeSum(nums):
# 方法一
# import copy
# def twoSum(nums,target):
# n = len(nums)
# start = 0;end = n-1
# while start < end:
# if nums[start]+nums[end] < target:
# start += 1
# elif nums[start]+nums[end] > target:
# end -= 1
# else:
# return nums[start],nums[end]
# return None,None
#
#
# n = len(nums)
# sl = sorted(nums)
# print sl
# ans = set()
# for i in range(n):
# singleAns = []
# target = 0-sl[i]
# temp = copy.deepcopy(sl)
# del temp[i]
# num1,num2 = twoSum(temp,target)
# print num1,num2
# if num1 != None and num2 != None:
# singleAns.append(sl[i])
# singleAns.append(num1)
# singleAns.append(num2)
# s = sorted(singleAns)
# addItem = tuple(s)
# ans.add(addItem)
#
#
# return map(list,ans)
# 方法二
n = len(nums)
nums.sort()
ans = set()
for index,num in enumerate(nums):
d = {}
for otherNum in nums[index+1:]:
if otherNum not in d:
d[-num-otherNum] = 1
else:
ans.add((num,-num-otherNum,-otherNum))
return map(list,ans)
相关文章推荐
- Criteria 控指针问题
- Android进程保活之绑定系统服务
- PHP单词
- 为什么volatile不能保证原子性而Atomic可以(valatile只保证可见性,不保证原子性)
- oracle exp/imp 导入导出命令
- 用python快速搭建WEB服务器
- syslinux 和 grub
- Redis简介及其使用方法
- java多线程-java死锁
- SparkStreaming可视化之Wisp
- 关于个人博客的所有有关说明
- javascript单词
- Cocos2dx 截屏功能 3.2以上版本
- Python3网络爬虫(四): 登录
- Selector的用法
- 类继承学习一
- 对c语言的初步了解
- UVALive 3295 Counting Triangles
- MPTCP - Linux Kernel MultiPath TCP project
- SpannableString使用详解