这篇文章是程序自动发表的,详情可以见
这里
href="http://ounix1xcw.bkt.clouddn.com/github.markdown.css" rel="stylesheet">
href="http://ounix1xcw.bkt.clouddn.com/github.markdown.css" rel="stylesheet">
这是leetcode的第15题--3Sum
题目
Given an array S of n integers, are there elements a, b, c in S such that a b c = 0? Find all unique triplets in the array which gives the sum of zero. Note: The solution set must not contain duplicate triplets.
For example, given array S = [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1, 2] ]
思路 最开始我想的就直接3重循环,再加判重的循环,暴力求解,当然超时了,要高于O(n3)。后来想到可以将正负数,0,分成三组来组合,然而最后两个数据过不了,在网上搜了一下,可以固定一个数,头尾双指针来移动,这是O(n2)。哎,折腾了一晚上,我好菜啊。 这是前几次的结果
show me the code
class Solution(object): def threeSum(self, nums): """ :type nums: List[int] :rtype: List[List[int]] """ rst = [] zero = [] #zeros neg = [] #negative pos = [] #positive for i in (nums): if i < 0: neg.append(i) elif i > 0: pos.append(i) else: zero.append(i) if len(zero) > 2: rst.append([0,0,0]) if neg == [] or pos == []: return rst if zero != []: if len(neg) > len(pos): for i in pos: if -i in neg: rst.append([-i,0,i]) else: for i in neg: if -i in pos: rst.append([i,0,-i]) pos.sort() neg.sort() if len(pos) == 1 and len(neg) == 1: return rst elif len(pos) == 1 : tmp = len(neg) - 1 while tmp > 0: sum = neg[tmp] neg[tmp-1] if sum == - pos[0]: rst.append([neg[tmp-1],neg[tmp],pos[0]]) break elif sum < - pos[0]: break tmp -= 1 elif len(neg) == 1: tmp = 0 while tmp < len(pos) - 1 : sum = pos[tmp] pos[tmp 1] if sum == - neg[0]: rst.append([neg[0],pos[tmp],pos[tmp 1]]) break elif sum > - neg[0]: break tmp -= 1 sameI = [] #avoid test several same num for i in range(len(pos)-1): if i in sameI: continue sameI.append(i) sameJ=[] for j in range(i 1,len(pos)): if j in sameJ: continue sameJ.append(j) sum = pos[i] pos[j] for k in neg: if sum > -k: break elif sum == -k: rst.append([k,pos[i],pos[j]]) sameI = [] for i in range(len(neg)-1): if i in sameI: continue sameI.append(i) sameJ=[] for j in range(i 1,len(neg)): if j in sameJ: continue sameJ.append(j) sum = neg[i] neg[j] for k in pos: if sum > -k: break elif sum == -k: rst.append([neg[i],neg[j],k]) fnl = [] for i in rst: if i not in fnl: fnl.append(i) return fnl