任务7

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& coins, int amount) {
        vector dp(amount+1,-1);
        sort(coins.begin(),coins.end());
        dp[0]=0;
        for(int i=1;i<=amount;i++){
            for(int j=0;ji)
                    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))

你可能感兴趣的:(任务7)