源自leetcode
Minimum Path Sum(最小路径和)
英文版:https://leetcode.com/problems/minimum-path-sum/
中文版:https://leetcode-cn.com/problems/minimum-path-sum/
#法一 简单dp版
class Solution(object):
def minPathSum(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
m,n=len(grid),len(grid[0])
for i in range(1,m):
grid[i][0]+=grid[i-1][0]
for j in range(1,n):
grid[0][j]+=grid[0][j-1]
for i in range(1,m):
for j in range(1,n):
grid[i][j]+=min(grid[i-1][j],grid[i][j-1])
return grid[-1][-1]
#o(m*n) dp版本
class Solution(object):
def minPathSum(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
m,n=len(grid),len(grid[0])
dp=[[0 for _ in range(n)] for _ in range(m)]
dp[0][0]=grid[0][0]
for i in range(1,m):
dp[i][0]=dp[i-1][0]+grid[i][0]
for j in range(1,n):
dp[0][j]=dp[0][j-1]+grid[0][j]
for i in range(1,m):
for j in range(1,n):
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j]
return dp[-1][-1]
Coin Change (零钱兑换)
英文版:https://leetcode.com/problems/coin-change/
中文版:https://leetcode-cn.com/problems/coin-change/
#法一 dp版本
class Solution(object):
def coinChange(self, coins, amount):
"""
:type coins: List[int]
:type amount: int
:rtype: int
"""
#构造网格
rs=[amount+1]*(amount+1)
rs[0]=0
for i in range(1,amount+1):
for c in coins:
if i>=c:
rs[i]=min(rs[i],rs[i-c]+1)
if rs[amount]==amount+1:
return -1
return rs[amount]
#法二 BFS版本
def coinChange(self, coins, amount):
"""
:type coins: List[int]
:type amount: int
:rtype: int
"""
#BFS solution
if amount==0:
return 0
value1=[0]
value2=[]
count=0
visited=[False]*(amount+1)
visited[0]=True
while value1:
count+=1
for v in value1:
for coin in coins:
newval=v+coin
if newval ==amount:
return count
elif newval> amount:
continue
elif not visited[newval]:
visited[newval]=True
value2.append(newval)
value1,value2=value2,[]
return -1
Best Time to Buy and Sell Stock(买卖股票的最佳时机)
英文版:https://leetcode.com/problems/best-time-to-buy-and-sell-stock/
中文版:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
maxpro,minp=0,float('inf')
for p in prices:
minp=min(minp,p)
pro= p- minp
maxpro=max(maxpro,pro)
return maxpro
Maximum Product Subarray(乘积最大子序列)
英文版:https://leetcode.com/problems/maximum-product-subarray/
中文版:https://leetcode-cn.com/problems/maximum-product-subarray/
class Solution(object):
def maxProduct(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
product=-sys.maxint-1;minp=maxp=0
for i in nums:
if i==0:
maxp=minp=0
product=max(product,0)
elif minp==0:
minp=maxp=i
product=max(product,maxp)
else:
minpi=minp*i
maxpi=maxp*i
minp=min(minpi,maxpi,i)
maxp=max(minpi,maxpi,i)
product=max(product,maxp,minp)
return product
Triangle(三角形最小路径和)
英文版:https://leetcode.com/problems/triangle/
中文版:https://leetcode-cn.com/problems/triangle/
class Solution(object):
def maxProduct(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
product=-sys.maxint-1;minp=maxp=0
for i in nums:
if i==0:
maxp=minp=0
product=max(product,0)
elif minp==0:
minp=maxp=i
product=max(product,maxp)
else:
minpi=minp*i
maxpi=maxp*i
minp=min(minpi,maxpi,i)
maxp=max(minpi,maxpi,i)
product=max(product,maxp,minp)
return product