力扣刷题 day14:10-14

1.超级丑数

超级丑数 是一个正整数,并满足其所有质因数都出现在质数数组 primes 中。

给你一个整数 n 和一个整数数组 primes ,返回第 n 个 超级丑数 。

题目数据保证第 n 个 超级丑数 在 32-bit 带符号整数范围内。力扣刷题 day14:10-14_第1张图片

方法一:动态规划 

#方法一:动态规划
def nthSuperUglyNumber(n,primes):
    dp=[0 for i in range(n+1)] #dp[i] 表示第i个丑数
    dp[1]=1 #第一个丑数
    point=[1 for i in range(len(primes))] #point[i]表示基础丑数对应的位置,即第几个丑数,*对应的prime[i]得到丑数
    for i in range(2,n+1):
        tem=[]  #保存可能出现的丑数,要进行排除,选出最小的可能的丑数
        for j in range(len(primes)):
            tem.append(primes[j]*dp[point[j]]) #可能的丑数
        dp[i]=min(tem)  #为最小的可能值
        for j in range(len(primes)):
            if primes[j]*dp[point[j]]==dp[i]:
                point[j]+=1  #指针移动,找到最小丑数对应的基础丑数位置,然后移动,避免重复
    return dp[-1]

2.零钱兑换 

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

你可以认为每种硬币的数量是无限的。力扣刷题 day14:10-14_第2张图片

方法一:动态规划 

#方法一:动态规划
def coinChange(coins,amount):
    dp=[[amount+1]*(amount+1) for i in range(len(coins)+1)] #dp[i][j] 表示前i种硬币换成j元的最小硬币数目
    dp[0][0]=0  #初始化
    for i in range(1,len(coins) +1):
        for j in range(amount + 1):
            if j

你可能感兴趣的:(力扣刷题,leetcode,算法,数据结构)