python_lintcode_109数字三角形_50数组剔除元素后的乘积

来源:互联网 发布:淘宝退款成功后钱在哪 编辑:程序博客网 时间:2024/05/19 22:23

109数字三角形

题目

给定一个数字三角形,找到从顶部到底部的最小路径和。每一步可以移动到下面一行的相邻数字上。

注意事项

如果你只用额外空间复杂度O(n)的条件下完成可以获得加分,其中n是数字三角形的总行数。

您在真实的面试中是否遇到过这个题? Yes
样例
比如,给出下列数字三角形:

[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
从顶到底部的最小路径和为11 ( 2 + 3 + 5 + 1 = 11)。

思路

  • 从倒数第二层开始,加上下一层相邻的两个数的最小值
  • 返回triangle[0][0]
[     [2],    [3,4],   [6,5,7],  [4,1,8,3]][     [2],           [2],        [11]    [3,4],         [9,10],   [7,6,10],]

代码

class Solution:    """    @param: triangle: a list of lists of integers    @return: An integer, minimum path sum    """    def minimumTotal(self, triangle):        # write your code here        #行        n=len(triangle)        if n==1:return triangle[0][0]        if triangle==[]:return []        for i in range(n-2,-1,-1):            for j in range(len(triangle[i])):                #从倒数第二层开始                triangle[i][j]=min(triangle[i+1][j],triangle[i+1][j+1])+triangle[i][j]        return triangle[0][0]    def min(self,a,b):        if a>b:return b        return a

50数组剔除元素后的乘积

题目

http://www.lintcode.com/zh-cn/problem/product-of-array-exclude-itself/
给定一个整数数组A。

定义B[i] = A[0] * … * A[i-1] * A[i+1] * … * A[n-1], 计算B的时候请不要使用除法。

您在真实的面试中是否遇到过这个题? Yes
样例
给出A=[1, 2, 3],返回 B为[6, 3, 2]

思路

  • 一开始不是很懂题目的要求
  • 后面看了别人的博客,原来是将元素剔除后,剩余的进行乘积,结果都保存到B
  • 其实可以用两次循环来做
  • 参考了大神们的博客
  • http://blog.csdn.net/shadowkael/article/details/52024039
  • 用左右因子进行乘积的方法,先得出每个元素的左右因子,再将其进行乘积,放于B
[1,2,3,4,5]左:1,   1*2,  1*2*3,   1*2*3*4      \    |   /           |        \  |  /          剔除5          \|/          */|\        / *| \*       /   |  \右: 5,   5*4,5*4*3,  5*4*3*2剔除:4    3    2        1结果:[120,60,40,30,24]

代码

class Solution:    """    @param: nums: Given an integers array A    @return: A long long array B and B[i]= A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1]    """    def productExcludeItself(self, nums):        # write your code here        lenA=len(nums)        if lenA==1:return [1]        if lenA==[]:return []        #first准备好左右因子        left_factor=[]        right_factor=[]        for i,j in zip(nums[:-1],nums[::-1]):            if left_factor and right_factor:                left_factor.append(left_factor[-1]*i)                right_factor.append(right_factor[-1]*j)            else:                left_factor.append(i)                right_factor.append(j)        #second对左右因子进行乘法运算,放于结果B        B=[]        for i in range(lenA):            #left_down和right_down为下标            left_down=i-1            right_down=lenA-i-2            left_down=self.cheng(left_down,left_factor)            right_down=self.cheng(right_down,right_factor)            B.append(left_down*right_down)        return B    def cheng(self,x,y):        if x>=0:                x=y[x]        else:                x=1        return x
原创粉丝点击