完全平方数
T279--完全平方数【中等题】 题目描述
题目描述
简言之就是找到最少的完全平方数来相加得到给定的目标数字。
不难看出,这道题目的状态转移方程为:nums[n] = Math.min(nums[n],nums[n - i* i] + 1)
,我们可以使用迭代的方法,不断的迭代调用之前每一个数字的平方数之和的最小个数。
算法细节
nums[n] = Math.min(nums[n],nums[n - i* i] + 1)
之前,应该先对nums[n]
进行一个判断。nums[n]==0
,那么就代表着在此之前,nums[n]
并没有被初始化,此时我们应该使用nums[n - i* i] + 1
对nums[n]
进行赋值,再进入下轮循环。nums[n]!=0
,则代表已经被初始化了,就可以按照上面的迭代方式取最小值了。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--零钱兑换【中等题】 题目描述
题目描述
简言之,使用最少的硬币数量,兑换成给定的金额。
我们对比一下上面的完全平方数的题目,会惊奇的发现,其实两者在本质上是完全一样的呀!哈哈!
我们可以将小于给定目标数的完全平方数,当做这道题目的硬币面额集合,经过这样的转换,我们是不是就完全一样啦!
当然,我们还是可以换一种算法实现方式的!
算法差别:
for(int i = 1 ; n >= i*i ; i++ )
for(int coin:coins)
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];
}