前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >刷题第10篇:从完全平方到零钱兑换

刷题第10篇:从完全平方到零钱兑换

作者头像
鹏-程-万-里
发布2020-04-02 17:59:25
2530
发布2020-04-02 17:59:25
举报

完全平方数

T279--完全平方数【中等题】 题目描述

题目描述

简言之就是找到最少的完全平方数来相加得到给定的目标数字。

1、解决思路

不难看出,这道题目的状态转移方程为:nums[n] = Math.min(nums[n],nums[n - i* i] + 1),我们可以使用迭代的方法,不断的迭代调用之前每一个数字的平方数之和的最小个数。

算法细节

  1. 在我们每次计算得到nums[n] = Math.min(nums[n],nums[n - i* i] + 1)之前,应该先对nums[n]进行一个判断。
  2. 如果nums[n]==0,那么就代表着在此之前,nums[n]并没有被初始化,此时我们应该使用nums[n - i* i] + 1nums[n]进行赋值,再进入下轮循环。
  3. 如果nums[n]!=0,则代表已经被初始化了,就可以按照上面的迭代方式取最小值了。

2、代码实现

public int numSquares(int n) {
    int[] nums = new int[n+1];
    return help(n,nums);
}
public int help(int n, int[] nums){
    if(n == 0) return 0;
    if(nums[n] > 0) return nums[n];

    for(int i = 1 ; n >= i*i ; i++ ){
        int num = help(n - i*i , nums);//获取n-i*i的完全平方数
        if(num >= 0 && nums[n] > 0) nums[n] = Math.min(nums[n] , num +1);
        if(num >= 0 && nums[n] == 0) nums[n] = num+1;//初始化
    }
    return nums[n];
}

零钱兑换

T322--零钱兑换【中等题】 题目描述

题目描述

简言之,使用最少的硬币数量,兑换成给定的金额。

1、解决思路

我们对比一下上面的完全平方数的题目,会惊奇的发现,其实两者在本质上是完全一样的呀!哈哈!

我们可以将小于给定目标数的完全平方数,当做这道题目的硬币面额集合,经过这样的转换,我们是不是就完全一样啦!

当然,我们还是可以换一种算法实现方式的!

算法差别:

  1. 在上面的完全平方中,由于我们不知道所有的完全平方的集合,所以我们需要每次去尝试小于当前target的下面的所有完全平方数。所以当时我们在遍历的时候,使用的代码是下面这样的:
for(int i = 1 ; n >= i*i ; i++ )
  1. 在这道题目中,题目已经明确给出了coins的集合类型,所以我们可以尝试着每次遍历给定的coins集合:
for(int coin:coins)
  1. 当我们更改遍历方式的时候,我们就需要额外考虑一种情况了,每次调用递归调用的时候,可能会出现一种target变为负值的情况,此时意味着target的值小于coin的值,那么此时是无法兑换的。因此,对于负值的情况,我们应当直接舍弃,不做任何的比较。

2、代码实现

public int coinChange(int[] coins, int amount) {
    int len = coins.length;
    if(len == 0) return 0;
    return coinChange(coins,amount,new int[amount+1]);
}
public int coinChange(int[] coins, int amount,int[] nums) {
    if(amount < 0) return -1;
    if(amount == 0) return 0;
    if(nums[amount] != 0) return nums[amount];
    //寻找上一个
    for(int coin:coins){
        int res = coinChange(coins,amount-coin,nums);//得到amount-coin的数量
        if(res >= 0 && nums[amount] > 0) nums[amount] = Math.min(nums[amount] , res+1);//比较更新最小值
        if(res >= 0 && nums[amount] == 0) nums[amount] = res+1;//赋初始值
    }
    if(nums[amount] == 0) nums[amount] = -1;
    return nums[amount];
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java小白成长之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、解决思路
  • 2、代码实现
  • 零钱兑换
    • 1、解决思路
      • 2、代码实现
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档