高级编程技术_课后作业(十三)

下面的题目都来自LeetCode

##第一题


题意分析

从一个环形数组里面取数字,但是不能取相邻的数字,其中头和尾也算是相邻的数字

 

题目思路

此题有两种取法:(0len-2)(1,len-1),我们只需要取这两个取法的结果中较大的一个即可。而对于其中一种取法的结果计算如下:

l  temp_2:记录在nums[i]前两个的位置处盗的钱的最大结果

l  temp_1:记录在nums[i]前一个的位置处盗的钱的最大结果

通过比较nums[i] + temp_2temp_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]

结果

猜你喜欢

转载自blog.csdn.net/zero_s_qiu/article/details/80332641
今日推荐