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