Q-20 Coin Change - LeetCode 322

PHOTO EMBED

Sat Sep 09 2023 15:12:02 GMT+0000 (Coordinated Universal Time)

Saved by @Ayush_dabas07

class Solution {
    //Q-20
    public int coinChange(int[] coins, int amount) {
        int n = coins.length;
        if(amount == 0)
        return 0;

        // int ans = solve(coins ,n-1 ,  amount , new Integer[n][amount+1]);
        // return ans >= (int)1e9 ? -1 : ans;

        //tabulization -> n*amt | sc- n*amt
        int dp[][]  = new int[n][amount+1];
        for(int i = 0 ;i < n ;i++){
            for(int j = 0 ;j < amount+1 ;j++){
                //base case
                if(i == 0){
                    if(j%coins[i] == 0)
                    dp[i][j] = j/coins[i];

                    else
                    dp[i][j] = (int) 1e9;
                }

                //recursion logic
                else{
                    int notake = 0 + dp[i-1][j];
                    int take = (int) 1e9;
                    if(j - coins[i] >= 0)
                    take = 1 + dp[i][j-coins[i]];

                    dp[i][j] = Math.min(take , notake);
                }
            }
        }
        //if >= 1e9 , return -1
        return dp[n-1][amount] >= (int)1e9 ? -1 : dp[n-1][amount];
    }
    /* in any question where it is mentioned infinite supply or multiple use , one of the 
    recursion calls will not reduce index , as we have to check it again and again till
    its invalid
    */
    //Recursion-> exponential(can't determine no. of options) | 
    //Memoization -> n*amt Sc-> n*amt + amt(stack height)
    public int solve(int coins[] , int i ,int amt , Integer[][] dp){
        if(i == 0){
            if(amt % coins[i] == 0)
            return amt/coins[i];

            else
            return (int) 1e9;
        }
        if(dp[i][amt] != null)
        return dp[i][amt];

        int notake = 0 + solve(coins , i-1 , amt , dp);
        int take = (int) 1e9;
        if(amt - coins[i] >= 0)
        take = 1 + solve(coins , i , amt  - coins[i] ,dp);

        return dp[i][amt] = Math.min(take , notake);
    }
}
content_copyCOPY

https://leetcode.com/problems/coin-change/