leetcode刷题记录(十二)


33.Search in Rotated Sorted Array

用二分查找

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
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
if not nums:
return -1
low, high = 0, len(nums)-1

while low <= high:
mid = (low+high)>>1
if target== nums[mid]:
return mid
if nums[low] <= nums[mid]:
if nums[low] <= target <= nums[mid]:
high = mid - 1
else:
low = mid + 1
else:
if nums[mid] <= target <= nums[high]:
low = mid + 1
else:
high = mid - 1

return -1

35.Search Insert Position

因为是sorted所以用二分查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution(object):
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
low = 0
high = len(nums) - 1
while low<=high:
mid = (low+high)//2
if nums[mid] == target:
return mid
if nums[mid] > target:
high = mid - 1
if nums[mid] < target:
low = mid + 1
return ((high+low)//2 + 1)

其实刚开始想到的是一个很慢的方法->

1
2
3
nums.append(target)
nums.sort()
return nums.index(target)

39.Combination Sum

dfs

1
2
3
4
5
6
7
8
9
10
11
12
res = []
def dfs(target, index, path):
if target < 0:
return
if target == 0:
res.append(path)
return
for i in range(index,len(candidates)):
dfs(target-candidates[i],i,path+[candidates[i]])

dfs(target,0,[])
return res

53.Maximum Subarray

1
2
3
4
5
6
cur = maxs =  -float('inf')
for i in xrange(len(nums)):
cur +=nums[i]
cur = max(cur,nums[i])
maxs = max(maxs,cur)
return maxs

538.Convert BST to Greater Tree

1
2
3
4
5
6
7
8
9
10
11
12
13
a = 0
def convertBST(self, root):
"""
:type root: TreeNode
:rtype: TreeNode
"""
if not root:
return None
self.convertBST(root.right)
self.a += root.val
root.val = self.a
self.convertBST(root.left)
return root

860.Lemonade Change

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
five, ten = 0, 0
for i in bills:
if i == 5:
five+=1
elif i == 10:
five -=1
ten +=1
else:
if ten > 0:
five -=1
ten -=1
else:
five -=3
if five < 0:
return False
return True

100.Same Tree

1
2
3
4
5
6
if p == None and q == None:
return True
if p and q:
return (p.val==q.val) and self.isSameTree(p.left,q.left) and self.isSameTree(p.right,q.right)
else:
return False

594.Longest Harmonious Subsequence

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def findLHS(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
m = {}
for i in nums:
if i not in m:
m[i] = 1
else:
m[i] += 1
l = 0
for i in m:
if m.get(i+1):
l = max(l,m[i]+m[i+1])
return l

671.Second Minimum Node In a Binary Tree

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def findSecondMinimumValue(self, root):
"""
:type root: TreeNode
:rtype: int
"""
self.ans = float('inf')
minx = root.val

def dfs(node):
if node:
if minx<node.val<self.ans:
self.ans = node.val
elif node.val == minx:
dfs(node.left)
dfs(node.right)
dfs(root)
return self.ans if self.ans < float('inf') else -1

152.Maximum Product Subarray

普通方法

1
2
3
4
5
6
7
max1 = big = small = nums[0]
for i in nums[1:]:
temp = big
big = max(i,i*big,i*small)
small = min(i,i*temp,i*small)
max1 = max(max1,big)
return max1

在讨论里看到的奇妙方法

1
2
3
4
5
6
def maxProduct(self, A):
B = A[::-1]
for i in range(1, len(A)):
A[i] *= A[i - 1] or 1
B[i] *= B[i - 1] or 1
return max(A + B)

942.DI String Match

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def diStringMatch(self, S):
"""
:type S: str
:rtype: List[int]
"""
i = 0
j = len(S)
res = []

for x in S:
if x=='I':
res.append(i)
i+=1
else:
res.append(j)
j-=1
res.append(j if S[-1]=='D' else i)
return res