题目:
示例 1:
输入:coins = [1,4,10], target = 19 输出:2 解释:需要添加面值为 2 和 8 的硬币各一枚,得到硬币数组 [1,2,4,8,10] 。 可以证明从 1 到 19 的所有整数都可由数组中的硬币组合得到,且需要添加到数组中的硬币数目最小为 2 。
思路:
我们观察上面例子中,如果只有硬币1,那么target只能为1,在此基础上添加硬币2,target就变为
3(原target+添加的硬币面额),再添加一枚硬币4,target就变为7
解释:原target值为3,表示原硬币数组能组成【1,2,3】这3个面额,添加硬币4后:
面额4:直接由硬币4构成
面额5:由硬币4与原本表示面额1构成
面额6:由硬币4与原本表示面额2构成(以此类推)
以此类推:我们可以发现当新添加的硬币为原target+1时,target=target+(target+1)
如果新添加硬币小于target+1,target=target+新添加硬币面额(这里可以根据上
面同理得到)
! 但是当新添加硬币大于target+1时,就会出现断层:
如:假设原本target值为3,添加了硬币5后,面额为4就无法用已有硬币表示。
现在我们就可以来完成这道题目了:
1. 对于给定硬币数组我们可以定义个值(i=0)表示当前所能表示的target值【注:当前指未
使用硬币数组的任何一枚硬币】
2. 定义额外获得的硬币(指无法从硬币数组中获得的硬币,这也是本题要返回的值):coin
3. 先对数组进行排序,这样我们可以方便我们判断对应的硬币与i的大小
4. 定义一个下标index指向硬币数组
-> 如果当前硬币值小于或等于i+1,那么我们就可以
更新i--->i=i+coins【index】,并且移动下标index--->index++;
-> 如果当前硬币值大于i+1,那么就意味着我们需要额外获得硬币,
那么就让coin++,且更新i值,i=i+额外获得的硬币面额,
为了使返回值coin最小,额外获得的硬币面额应设置为最大值(i+1)
5.最后当i>=target,便可结束
代码: