-
Notifications
You must be signed in to change notification settings - Fork 20
/
ThreeSum.py
75 lines (62 loc) · 1.91 KB
/
ThreeSum.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# -*- coding: UTF-8 -*-
#
# 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]
# ]
#
# Python 2 accepted. Python 3 Time Limit Exceeded.
class ThreeSum:
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
nums = sorted(nums)
m_set = set()
for first in range(len(nums) - 2):
if nums[first] > 0:
break
target = 0 - nums[first]
second = first + 1
third = len(nums) - 1
while second < third:
if nums[second] + nums[third] == target:
m_set.add(Triple(nums[first], nums[second], nums[third]))
while second < third and nums[second] == nums[second + 1]:
second += 1
while second < third and nums[third] == nums[third - 1]:
third -= 1
second += 1
third -= 1
elif nums[second] + nums[third] < target:
second += 1
else:
third -= 1
lists = []
for t in m_set:
lists.append([t.a, t.b, t.c])
return lists
class Triple:
def __init__(self, a, b, c):
"""
:param a: int
:param b: int
:param c: int
"""
self.a = a
self.b = b
self.c = c
def __eq__(self, other):
if isinstance(other, self.__class__):
return self.a == other.a and self.b == other.b and self.c == other.c
def __hash__(self):
return (-self.a) * 100 + abs(self.b) * 10 + self.c