下面的题目都来自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]