刷題322. Coin Change

一、題目說明

題目322. Coin Change,給定一組不同面值的硬幣,計算給定的總金額可以用硬幣湊成的最小數量。難度是Medium!

二、我的解答

這個題目,思考了一下,和前面的279. Perfect Squares有點類似,屬於求最優解的問題。解答方法無外乎用遞歸,或者dp。但是這個沒做出來,由於沒有找到最優子結構。網上找到的代碼:

class Solution{
	public:
		//dfs + memorization
		int coinChange(vector<int>& coins,int amount){
			vector<int> memo(amount+1,-2);
			return dfs(coins,amount,memo);
		}
		
		int dfs(vector<int>& coins,int amount,vector<int>& memo){
			if(amount == 0) return 0;
			if(memo[amount] != -2){
				return memo[amount];
			}
			int ans = INT_MAX;
			for(int coin: coins){
				if(amount-coin<0) continue;
				int subProc = dfs(coins,amount-coin,memo);
				if(subProc == -1){
					continue;
				}
				ans = min(ans,subProc+1);
			}
			memo[amount] = (ans == INT_MAX) ? -1 : ans;
			return memo[amount];
		}
};

性能:

Runtime: 80 ms, faster than 22.84% of C++ online submissions for Coin Change.
Memory Usage: 14.5 MB, less than 27.45% of C++ online submissions for Coin Change.

三、優化措施

用dp寫:

class Solution{
	public:
		//dp solution: dp[i] means the minimum num of coins used
		int coinChange(vector<int>& coins,int amount){
			vector<int> dp(amount+1,amount+1);
			dp[0] = 0;
			int len = coins.size();
			for(int i=1;i<=amount;i++){
				for(int j=0;j<len;j++){
					if(coins[j]<=i){
						dp[i] = min(dp[i],dp[i-coins[j]] + 1);
					}
				}
			}
			if(dp[amount]==amount+1){
				return -1;
			}else return dp[amount];
		}
};

性能如下:

Runtime: 48 ms, faster than 70.77% of C++ online submissions for Coin Change.
Memory Usage: 12.6 MB, less than 86.27% of C++ online submissions for Coin Change.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章