leetcode-python 第六周
2016-08-02 11:17
435 查看
LeetCode Online Judge
https://leetcode.com/
https://leetcode.com/
1.Combination Sum [208ms]
#方法1:dfs,适当剪枝 class Solution(object): import copy def combinationSum(self, candidates, target): result = [] tmp = [] sorted(candidates) self.dfs(0, tmp, result, candidates, target) return result def dfs(self, k, tmp, result, candidates, target) : if k > len(candidates) : return if sum(tmp) > target : return elif sum(tmp) == target : t = copy.deepcopy(tmp) result.append(t) for i in range(k, len(candidates)) : tmp.append(candidates[i]) #这里传i到k可以避免重复 self.dfs(i, tmp, result, candidates, target) del tmp[-1]
2.Contruct Binary Tree from Inorder and Postorder Traversal [128ms]
#方法1:类型跟前序中序类似,用索引而不用切片 class Solution(object): def construct(self, inorder, istart, iend, postorder, pstart, pend) : if istart > iend : return None else : node = TreeNode(postorder[pend]) iroot = inorder.index(postorder[pend]) llen = iroot - istart rlen = iend - iroot left_istart = istart left_iend = left_istart + llen - 1 left_pstart = pstart left_pend = left_pstart + llen - 1 right_istart = iroot + 1 right_iend = right_istart + rlen - 1 right_pstart = left_pend + 1 right_pend = right_pstart + rlen - 1 node.left = self.construct(inorder, left_istart, left_iend, postorder, left_pstart, left_pend) node.right = self.construct(inorder, right_istart, right_iend, postorder, right_pstart, right_pend) return node def buildTree(self, inorder, postorder): return self.construct(inorder, 0, len(inorder)-1, postorder, 0, len(postorder)-1)
3.Construct Binary Tree from Preorder and Inorder Traversal
#方法1:递归,爆内存 #方法2:递归修改版,不用切片不然会爆Memery,用指针操作 def solution(preorder, inorder) : if len(preorder) : in_root = inorder.index(preorder[0]) in_left = inorder[:in_root] in_right = inorder[in_root+1:] pre_left = preorder[1:len(in_left)+1] pre_right = preorder[1+len(in_left):] header = TreeNode(preorder[0]) header.left = solution(pre_left, in_left) header.right = solution(pre_right, in_right) return header else : return class Solution(object): def construct(self, preorder, pstart, pend, inorder, istart, iend): if pstart > pend: return None else: header = TreeNode(preorder[pstart]) root = inorder.index(preorder[pstart]) llen = root - istart rlen = iend - root left_pstart = pstart + 1 left_pend = left_pstart + llen - 1 left_istart = istart left_iend = left_istart + llen - 1 right_pstart = left_pend + 1 right_pend = right_pstart + rlen - 1 right_istart = root + 1 right_iend = right_istart + rlen - 1 header.left = self.construct(preorder, left_pstart, left_pend, inorder, left_istart, left_iend) header.right = self.construct(preorder, right_pstart, right_pend, inorder, right_istart, right_iend) return header def buildTree(self, preorder, inorder): return self.construct(preorder, 0, len(preorder)-1, inorder, 0, len(inorder)-1)
4.Maximum Subarry [68ms]
#方法1:参考网上的dp #只有两种情况,要么加上前序列,要么另开 class Solution(object): def maxSubArray(self, nums): l = len(nums) dp = [nums[i] for i in range(l)] for i in range(1, l) : dp[i] = max(dp[i-1] + nums[i], nums[i]) return max(dp)
5.Rotate Image [56ms]
#方法1:额外空间,ans的第一个坐标和matrix第二个坐标相加等于n [56ms] #方法2: 四个位置相对变换,拿四个角操作就知道[56ms] #方法3:先"/"对角线反转,再上下翻转 # #总结: # [i, j] = [j, i] "\"对角线 # [i, j] = [n-1-j, n-1-i] "/"对角线 # [i, j] = [n-1-i, n-1-j] "."中心点对称 class Solution(object): def rotate(self, matrix): n = len(matrix) ans = [[0 for i in range(n)] for i in range(n)] for i in range(n) : for j in range(n) : ans[j][n-1-i] = matrix[i][j] for i in range(n) : for j in range(n) : matrix[i][j] = ans[i][j] class Solution(object): def rotate(self, matrix): n = len(matrix) half = int(n / 2) for i in range(half+1): for j in range(i, n-1-i): tmp = matrix[i][j] matrix[i][j] = matrix[n-1-j][i] matrix[n-1-j][i] = matrix[n-1-i][n-1-j] matrix[n-1-i][n-1-j] = matrix[j][n-1-i] matrix[j][n-1-i] = tmp class Solution(object): def rotate(self, matrix): n = len(matrix) half = int(n / 2) for i in range(n) : for j in range(n-i) : matrix[i][j], matrix[n-1-j][n-1-i] = matrix[n-1-j][n-1-i], matrix[i][j] for i in range(half) : for j in range(n) : matrix[i][j], matrix[n-1-i][j] = matrix[n-1-i][j], matrix[i][j]
6.Search For a Range[48ms]
#方法1:条件 low < high - 1 会提供两个候选值 #分别判断就可以 class Solution(object): def searchRange(self, nums, target) : low, high = 0, len(nums) - 1 while low < high - 1 : mid = int((low + high) / 2) if nums[mid] == target : high = mid elif target < nums[mid] : high = mid else : low = mid if target == nums[low] : left = low elif target == nums[high] : left = high else : left = -1 low, high = 0, len(nums) - 1 while low < high - 1 : mid = int((low + high) / 2) if nums[mid] == target : low = mid elif target < nums[mid] : high = mid else : low = mid if target == nums[high] : right = high elif target == nums[low] : right = low else : right = -1 return [left, right]
7.Search Insert Position [52ms]
#方法1:二分搜索,因为搜不到low会加一,所以直接返回low class Solution(object): def searchInsert(self, nums, target): low, high = 0, len(nums) while low < high : mid = int((low + high) / 2) if nums[mid] == target : return mid if target < nums[mid] : high = mid else : low = mid + 1 return low
相关文章推荐
- 【LeetCode with Python】 Wildcard Matching
- 【LeetCode with Python】 Generate Parentheses
- 【LeetCode with Python】 Remove Duplicates from Sorted Array
- 【LeetCode with Python】 Binary Tree Preorder Traversal
- 【LeetCode with Python】 Maximum Depth of Binary Tree
- 【LeetCode with Python】 Binary Tree Inorder Traversal
- 【LeetCode with Python】 Pow(x, n)
- 【LeetCode with Python】 Maximum Subarray
- 【LeetCode with Python】 Insertion Sort List
- 【LeetCode with Python】 Best Time to Buy and Sell Stock
- 【LeetCode with Python】 Swap Nodes in Pairs
- 【LeetCode with Python】 Reverse Words in a String
- 【LeetCode with Python】 Remove Duplicates from Sorted List
- 【LeetCode with Python】 String to Integer (atoi)
- 【LeetCode with Python】 LRU Cache
- 【LeetCode with Python】 Remove Element
- 【LeetCode with Python】 Validate Binary Search Tree
- 【LeetCode with Python】 Pascal's Triangle
- 【LeetCode with Python】 Balanced Binary Tree
- 【LeetCode with Python】 Minimum Depth of Binary Tree