标签:
这道题县排序 然后设定好第一位,后面两位夹逼搜索就好, 但是因为数字会出现重复,导致得出的3元祖也有可能重复,一开始我的办法是采用set来避免多次加入同样的三元组,运行时间为 344ms
class Solution: # @param {integer[]} nums # @return {integer[][]} def threeSum(self, nums): length = len(nums) if length <= 2: return [] nums = sorted(nums) ans = set() for i in range(0, length - 2): j = i + 1 k = length - 1 while j < k: s = nums[i] + nums[j] + nums[k] if s == 0: ans.add((nums[i], nums[j], nums[k])) j += 1 elif s < 0: j += 1 else: k -= 1 ret = [] for a in ans: ret.append(list(a)) return ret
看了下Python runtime distributtion 发现有一些python解法明显比我快, 因此优化了一下避免重复加入3元组的部分, 不使用set, 而是在夹逼时如果发现相邻两个数相等则不继续求和判断,结果运行时间 212ms 有了明显提高,代码如下
class Solution: # @param {integer[]} nums # @return {integer[][]} def threeSum(self, nums): length = len(nums) if length <= 2: return [] nums = sorted(nums) ans = [] i = 0 while i < length - 2: j = i + 1 k = length - 1 while j < k: s = nums[i] + nums[j] + nums[k] if s == 0: ans.append([nums[i], nums[j], nums[k]]) j += 1 k -= 1 while j < k and nums[j] == nums[j-1]: j += 1 while j < k and nums[k] == nums[k+1]: k -= 1 elif s < 0: j += 1 else: k -= 1 i += 1 while i < length - 2 and nums[i] == nums[i-1]: i += 1 return ans
标签:
原文地址:http://www.cnblogs.com/dapanshe/p/4629054.html