LeetCode 322. Coin Change(동적 계획 및 소급법)
-1
. Example 1:
Input: coins = [1, 2, 5]
, amount = 11
Output: 3
Explanation: 11 = 5 + 5 + 1
Example 2:
Input: coins = [2]
, amount = 3
Output: -1
--------------------------------------------------------------------------------------
먼저 거슬러 올라가는 코드를 직접 썼는데 시간이 초과된 것을 발견했다.
LetCode 토론 구역에서 합리적인 욕심과 가지치기를 결합한 소급 해법을 발견했다.
Runtime: 1 ms, faster than 100.00% of Java online submissions for Coin Change.
코드는 아래와 같이 두 개의 가지치기 세부 사항을 아직 이해하지 못했다
class Solution {
//1 ms
int minCount = Integer.MAX_VALUE;//
public int coinChange(int[] coins, int amount) {
Arrays.sort(coins);
dfs(amount, coins.length-1, coins, 0);
return minCount == Integer.MAX_VALUE?-1:minCount;
}
private void dfs(int amount, int start, int[] coins, int count){
if(start<0 || count+2>minCount) return;
for (int i = amount/coins[start];i>=0;i--){
// : dfs, 。 ,
int newAmount = amount - i*coins[start];
int newCount = count + i;
if(newAmount>0 && newCount+1
----------------------------------------------------------------------------------------------
다음은 동적 계획 방법입니다.
참고 주석은 이해하기 쉬울 것이다
public class Solution {
public int coinChange(int[] coins, int amount) {
int[] dp = new int[amount+1];//dp[i] i . i = 0,1,2,....amount
//dp[0] = 0; // 0 0
int target = 1;//
while(target<=amount) {
// 0,1,2,3,...target-1 , target
int min = -1;// target
for(int coin : coins) {
if(target >= coin && dp[target-coin]!=-1) {
if(min==-1) min = dp[target-coin]+1;
else if(dp[target-coin]+1 < min) min = dp[target-coin]+1;
}
// min -1
}
dp[target] = min;// : sum
target++;
}
return dp[amount];
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.