1. 程式人生 > >Leetcode 763. Partition Labels

Leetcode 763. Partition Labels

super 動態規劃 mach chan com http info nta ges

技術分享圖片

思路:動態規劃。對於屬於coins的coin,只要知道amount-coin至少需要多少個貨幣就能表示,那麽amount需要的貨幣數目=amount-coin需要的貨幣數目+1;如果amount-coin都不能被表示,amount也不能被表示。

方法一:遞歸,由上至下。

 1 class Solution {
 2     Map<Integer, Integer> hashMap = new HashMap<>();
 3     public int coinChange(int[] coins, int amount) {
 4         hashMap.put(0, 0);//
0元不需要被貨幣表示 5 if(hashMap.containsKey(amount)) return hashMap.get(amount); 6 int curMin = amount + 1;//貨幣的最小面值只能是1,所以最多能被表示成amount個貨幣,那麽amount+1就相當於正無窮 7 for(int coin : coins) { 8 if(amount >= coin) { 9 int cur = coinChange(coins, amount - coin) + 1;
10 if(cur > 0 && curMin > cur) curMin = cur;//cur==0就意味著amount-coin不能被當前貨幣表示 11 } 12 } 13 if(curMin == amount + 1) {//已經遍歷過的元素的表示數目要及時記錄 14 hashMap.put(amount, -1); 15 }else { 16 hashMap.put(amount, curMin); 17 }
18 return hashMap.get(amount); 19 } 20 }

Next challenges: Longest Increasing Subsequence Arithmetic Slices II - Subsequence Super Washing Machines

方法二:遞推,由下至上。

 1 class Solution {
 2     Map<Integer, Integer> hashMap = new HashMap<>();
 3     public int coinChange(int[] coins, int amount) {
 4         hashMap.put(0, 0);//0元不需要被貨幣表示
 5         int MAX = amount + 1;
 6         for(int i = 1; i <= amount; i++) {
 7             hashMap.put(i, MAX);//面值為i能被表示成貨幣的數目的最小值
 8             for(int coin : coins) {
 9                 if(i >= coin) {
10                     hashMap.put(i, Math.min(hashMap.get(i), hashMap.get(i - coin) + 1));
11                 }
12             }
13         }
14         //對於面值i,只要i映射的值大於i就相當於i不能被當前的貨幣表示
15         return hashMap.get(amount) > amount ? -1 : hashMap.get(amount);
16     }
17 }

Leetcode 763. Partition Labels