代码随想录补打卡 322零钱兑换 279 完全平方数 139 单词拆分

文章提供了三个使用动态规划解决的编程问题:一是找到装满特定金额硬币的最少数量;二是计算一个数由几个完全平方数相加得到;三是判断一个字符串是否能由给定字典中的单词拆分。代码中用到了动态规划的初始化、状态转移和最小值比较策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码如下

func coinChange(coins []int, amount int) int {

           dp := make([]int,amount+1)   //dp[j]数组的含义是装满容量为j的背包最少需要几件物品

           dp[0] = 0    

           for j := 1 ; j <= amount ; j++ {  //因为是取最小物品,所以为了避免递推关系式时,被默认值0取代,所以将所有的初始值设置为最大值

               dp[j] = math.MaxInt

           }

           for i := 0 ; i < len(coins) ; i++ {

               for j := coins[i] ; j <= amount ; j++ {

                   if dp[j-coins[i]] != math.MaxInt {  //因为是比较放与不放物品的最小值,所以如果这个值是int最大值就没有放入的必要

                       dp[j] = min(dp[j],dp[j-coins[i]]+1)

                   }

               }

           }

           if dp[amount] == math.MaxInt {  如果这个数值还是初始值没有被改变,说明没有能够满足这个背包容量的元素组合 

               return -1

           }else {

               return dp[amount]

           }

}

func min(a,b int) int {

    if a < b {

        return a

    }else {

        return b 

    }

}

279 完全平方数 

代码如下

func numSquares(n int) int {

      dp := make([]int,n+1)

           dp[0] = 0 

           for j := 1 ; j <= n ; j++ {

               dp[j] = math.MaxInt

           }

           for i := 1 ; i*i <= n ; i++ {

               for j :=  i*i ; j <= n ; j++ {

                   if dp[j-i*i] != math.MaxInt {

                       dp[j] = min(dp[j],dp[j-i*i]+1)

                   }

               }

           }

           if dp[n] == math.MaxInt {

               return -1

           }else {

               return dp[n]

           }

}

func min(a,b int) int {

    if a < b {

        return a

    }else {

        return b 

    }

}

139 单词拆分 

代码如下

func wordBreak(s string, wordDict []string) bool {

              worddictset := make(map[string]bool)   //设置一个map,用于存放字典里的单词,单词设为key值,value为真。表示这些单词存在

              for _,v := range wordDict {

                  worddictset[v] = true  //遍历单词集,将每个单词设置为存在 即value为真 

              }

              dp := make([]bool,len(s)+1)  //设置dp数组,dp数组含义为当前个字母下,存在于字典中

              dp[0] = true 

              for i := 1 ; i <= len(s) ; i++ {   遍历背包

                  for j := 0 ; j < i ; j++ { 遍历物品,物品是从0开始到背包容量,假如背包容量为i则最后一个物品即字母下标为i-1

                      if dp[j] && worddictset[s[j:i]] {  如果dp[j]为真,且j-i这一段组成的字符也存在于字典里,那么整个dp[i]就为真,立刻退出循环,没必要继续将j后移进行判断 

                          dp[i] = true 

                          break 

                      }

                  }

              }

              return dp[len(s)]

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值