Skip to content

Commit 94a361a

Browse files
committed
2019-05-25
1 parent fdeceb1 commit 94a361a

File tree

5 files changed

+272
-0
lines changed

5 files changed

+272
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
class Solution(object):
2+
def threeSum(self, nums):
3+
"""
4+
:type nums: List[int]
5+
:rtype: List[List[int]]
6+
"""
7+
#固定a,用双指针在排序数组里找两数之和为-a
8+
nums.sort()
9+
l = len(nums)
10+
res = []
11+
for i, a in enumerate(nums):
12+
if i == 0 or nums[i] > nums[i - 1]:
13+
#开始双指针
14+
left, right = i + 1, len(nums) - 1
15+
while(left < right):
16+
s = a + nums[left] + nums[right]
17+
if s == 0:
18+
tmp = [a, nums[left], nums[right]]
19+
res.append(tmp)
20+
left += 1
21+
right -= 1
22+
while left < right and nums[left] == nums[left - 1]:
23+
left += 1
24+
while right > left and nums[right] == nums[right + 1]:
25+
right -= 1
26+
elif s < 0:
27+
left += 1
28+
elif s > 0:
29+
right -= 1
30+
return res
31+
32+
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
class Solution(object):
2+
def fourSum(self, n, target):
3+
"""
4+
:type nums: List[int]
5+
:type target: int
6+
:rtype: List[List[int]]
7+
"""
8+
self.res = []
9+
n.sort()
10+
# print n
11+
def threeSum(nums,t, d):
12+
"""
13+
:type nums: List[int]
14+
:rtype: List[List[int]]
15+
"""
16+
#固定a,用双指针在排序数组里找两数之和为-a
17+
l = len(nums)
18+
res = []
19+
for i, a in enumerate(nums):
20+
if i == 0 or nums[i] > nums[i - 1]:
21+
#开始双指针
22+
left, right = i + 1, len(nums) - 1
23+
while(left < right):
24+
s = a + nums[left] + nums[right]
25+
# print d, a, nums[left], nums[right]
26+
if s == t:
27+
tmp = [d,a, nums[left], nums[right]]
28+
self.res.append(tmp)
29+
left += 1
30+
right -= 1
31+
while left < right and nums[left] == nums[left - 1]:
32+
left += 1
33+
while right > left and nums[right] == nums[right + 1]:
34+
right -= 1
35+
elif s < t:
36+
left += 1
37+
elif s > t:
38+
right -= 1
39+
40+
for i in range(len(n) - 3):
41+
if i == 0 or n[i] > n[i - 1]:
42+
# print n[i]
43+
threeSum(n[i + 1:], target - n[i], n[i])
44+
45+
46+
return self.res
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
class Solution(object):
2+
def multiply(self, num1, num2):
3+
"""
4+
:type num1: str
5+
:type num2: str
6+
:rtype: str
7+
"""
8+
if len(num1) < len(num2):
9+
num1, num2 = num2, num1
10+
if num1 == "0" or num2 == "0":
11+
return "0"
12+
13+
num2 = num2[::-1]
14+
tmp, res = [],[]
15+
for i, char in enumerate(num2):
16+
tmp = self.stringMultiDigit(num1, int(char)) + "0" * i #计算当前位乘法的结果,注意末尾添0
17+
res = self.stringPlusString(res, tmp) #加上当前位结果
18+
19+
return "".join(res)
20+
21+
def stringMultiDigit(self,s, n): #计算一个字符串和一个数字的乘积, 返回字符串
22+
s = s[::-1]
23+
l = []
24+
for char in s:
25+
l.append(int(char))
26+
27+
for i, char in enumerate(l):
28+
l[i] *= n
29+
30+
for i, char in enumerate(l):
31+
while(l[i] > 9):
32+
tmp = l[i] // 10
33+
l[i] -= tmp * 10
34+
if i == len(l) - 1:
35+
l.append(0)
36+
l[i + 1] += tmp
37+
38+
return "".join(str(char) for char in l[::-1])
39+
40+
41+
def stringPlusString(self,s1, s2): #字符串加法,返回字符串
42+
# print s1, s2
43+
s1, s2 = s1[::-1], s2[::-1]
44+
l1, l2 = [], []
45+
for char in s1:
46+
l1.append(int(char))
47+
for char in s2:
48+
l2.append(int(char))
49+
# tmp = []
50+
if len(l1) < len(l2):
51+
l1, l2 = l2, l1
52+
i = 0
53+
for i in range(len(l2)):
54+
l1[i] += l2[i]
55+
if l1[i] > 9:
56+
l1[i] -= 10
57+
if i == len(l1) - 1:
58+
l1.append(0)
59+
l1[i + 1] += 1
60+
i += 1
61+
if i < len(l1) - 1: #处理最后一位可能的进位
62+
if l1[i] > 9:
63+
l1[i] -= 10
64+
if i == len(l1) - 1:
65+
l1.append(0)
66+
l1[i + 1] += 1
67+
68+
return "".join(str(char) for char in l1[::-1])
69+
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
class Solution(object):
2+
def search(self, nums, target):
3+
"""
4+
:type nums: List[int]
5+
:type target: int
6+
:rtype: bool
7+
"""
8+
#如果第一个数和最后一个数不相等,那么跟上一题没有区别
9+
#如果第一个数和最后一个数相等,而且等于target,return true
10+
#如果第一个数和最后一个数相等,但是不等于target,在最坏的情况下就需要遍历两个升序数组的某一个,已确定target有可能落在哪一段,极端情况时间复杂度会降低到0(N)
11+
if not nums:
12+
return False
13+
if nums[0] != nums[-1]:
14+
return self.search1(nums, target)
15+
if nums[0] == nums[-1]:
16+
if nums[0] == target:
17+
return True
18+
else:
19+
# for num in nums: #偷懒就可以这么写……直接上O(N)的算法
20+
# if num == target:
21+
# return True
22+
# return False
23+
return self.search2(nums, target)
24+
25+
def search1(self, nums, target): #上一题的解答,两次二分查找分别找旋转点和结果
26+
"""
27+
:type nums: List[int]
28+
:type target: int
29+
:rtype: int
30+
"""
31+
if not nums:
32+
return -1
33+
if len(nums) == 1:
34+
return True if nums[0] == target else False
35+
36+
lo, hi = 0, len(nums) - 1
37+
while(lo <= hi):
38+
mid = (lo + hi) // 2
39+
if mid + 1 < len(nums) and nums[mid] > nums[mid +1]: #旋转点为mid
40+
break
41+
if nums[mid] <= nums[-1]:
42+
hi = mid - 1
43+
elif nums[mid] >= nums[0]:
44+
lo = mid + 1
45+
46+
if lo > hi:#没有旋转
47+
lo, hi = 0, len(nums) - 1
48+
else:
49+
if target >= nums[0]:
50+
lo, hi = 0, mid
51+
else:
52+
lo, hi = mid + 1, len(nums) - 1
53+
54+
while(lo <= hi):
55+
mid = (lo + hi) // 2
56+
if nums[mid] == target:
57+
return True
58+
elif nums[mid] > target:
59+
hi = mid - 1
60+
else:
61+
lo = mid + 1
62+
63+
return False
64+
65+
def search2(self, nums, target):#这种情况下nums[0] == nums[-1]
66+
"""
67+
:type nums: List[int]
68+
:type target: int
69+
:rtype: int
70+
"""
71+
if not nums:
72+
return -1
73+
if len(nums) == 1:
74+
return True if nums[0] == target else False
75+
76+
lo, hi = 0, len(nums) - 1
77+
while(lo <= hi):
78+
mid = (lo + hi) // 2
79+
if mid + 1 < len(nums) and nums[mid] > nums[mid +1]:
80+
break
81+
if nums[mid] == nums[0]: #无法确定mid落在哪一段
82+
i = mid
83+
while(i < len(nums) - 1 and nums[i] == nums[i + 1]):
84+
i += 1
85+
if i == len(nums) - 1:#整个右段都找完了,全部跟nums[0]一样,所以target肯定落在左侧,也就是0 ~ mid这一段
86+
hi = mid - 1
87+
else:
88+
lo = mid + 1
89+
90+
if nums[mid] < nums[-1]:
91+
hi = mid - 1
92+
elif nums[mid] > nums[0]:
93+
lo = mid + 1
94+
95+
if target > nums[mid]:
96+
return False #因为mid一定是最大的那个数
97+
elif target == nums[mid]: #找到了就直接返回
98+
return True
99+
elif target < nums[mid]: #还需要二分查找,现在要确认找左侧还是找右侧
100+
if target > nums[0]: #在左侧找
101+
lo, hi = 0, mid - 1
102+
else: #在右侧找
103+
lo, hi = mid + 1, len(nums) - 1
104+
105+
while(lo <= hi):
106+
mid = (lo + hi) // 2
107+
if nums[mid] == target:
108+
return True
109+
elif nums[mid] > target:
110+
hi = mid - 1
111+
else:
112+
lo = mid + 1
113+
114+
return False
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class Solution(object):
2+
def grayCode(self, n):
3+
"""
4+
:type n: int
5+
:rtype: List[int]
6+
"""
7+
# G(i) = i ^ (i /2)
8+
dp = [0 for _ in range(2 ** n)]
9+
for i in range(1, 2 ** n):
10+
dp[i] = i ^ (i /2)
11+
return dp

0 commit comments

Comments
 (0)