下面的题目都来自LeetCode
##第一题
题意分析
从一个环形数组里面取数字,但是不能取相邻的数字,其中头和尾也算是相邻的数字
题目思路
此题有两种取法:(0,len-2)、(1,len-1),我们只需要取这两个取法的结果中较大的一个即可。而对于其中一种取法的结果计算如下:
l temp_2:记录在nums[i]前两个的位置处盗的钱的最大结果
l temp_1:记录在nums[i]前一个的位置处盗的钱的最大结果
通过比较nums[i] + temp_2与temp_1的大小,来确定是否要取nums[i]这个位置的数
题目代码
class Solution(object): def rob(self, nums): """ :type nums: List[int] :rtype: int """ if len(nums) == 0: return 0 if len(nums) == 1: return nums[0] return max(r(nums, 0, len(nums)-2), r(nums, 1, len(nums)-1)) def r(nums, begin, end): temp_1 = 0 temp_2 = 0 ans = 0 for i in range(begin, end+1): ans = max(temp_1, temp_2 + nums[i]) temp_2 = temp_1 temp_1 = ans return ans
结果
##第二题
题意分析
从一组排列成三角形的数组中找到一条从上到下的路径,其中相邻两行取数字的位置要相邻
题目思路
从下到上取,每一步都取最短的路径:
Min_path[i][j] = min( min_path[i+1][j] + min_path[i+1][j+1] )
代码
class Solution(object): def minimumTotal(self, triangle): """ :type triangle: List[List[int]] :rtype: int """ if len(triangle) == 0: return 0 if len(triangle) == 1: return triangle[0][0] mini = list(range(0, len(triangle))) for i in range(0, len(triangle)): mini[i] = triangle[len(triangle) - 1][i] temp = list(range(1, len(triangle))) temp.reverse() for i in temp: for j in range(0, i): mini[j] = triangle[i-1][j] + min(mini[j], mini[j+1]) return mini[0]