leetcode64. 最小路径和
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
技巧:不用递归,原地更新该位置的最小路径和
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
if not grid:
return
num1 = len(grid)
num2 = len(grid[0])
if num1==1:
return sum(grid[0])
sum1=0
if num2==1:
for i in range(0,num2):
sum1=sum1+grid[i][0]
return sum1
for i in range(1,num2):
grid[0][i]=grid[0][i-1]+grid[0][i]
for j in range(1,num1):
grid[j][0]=grid[j-1][0]+grid[j-1][0]
for i in range(2,num1):
for j in range(2,num2):
if grid[i-1][j]<=grid[i][j-1]:
grid[i][j]=grid[i-1][j]+grid[i][j]
else:
grid[i][j]=grid[i][j-1]+grid[i][j]
return grid[num1-1][num2-1]
leetcode322. 零钱兑换
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
vector<int> dp(amount+1,-1);
sort(coins.begin(),coins.end());
dp[0]=0;
for(int i=1;i<=amount;i++){
for(int j=0;j<coins.size();j++){
if(coins[j]>i)
break;
if(dp[i-coins[j]]!=-1){
if(dp[i]==-1 ||dp[i]>dp[i-coins[j]]+1){
dp[i]=dp[i-coins[j]]+1;
}
}
}
}
return dp[amount];
}
};
leetcode70. 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
class Solution:
def climbStairs(self, n: int) -> int:
if n==1 or n==0:
return 1
elif n==2:
return 2
else:
return self.climbStairs(n-1)+self.climbStairs(n-2)
leetcode46. 全排列
给定一个没有重复数字的序列,返回其所有可能的全排列。
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
from itertools import permutations
return list(permutations(nums))