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

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

你可能感兴趣的:(python_lintcode)