Min steps to one

Min steps to one

Min Steps to One

My approach:

In questions where we have to find all possible values, we use recursion.

Whenever we use recursion we can always use memoization to tackle overlapping subproblems.

But in the end, every solution can be done using dynamic programming.

My solution:

  • Recursive:

image1

  • Iterative:

image2

Code:

  • Recursion with Memoization

#include <bits/stdc++.h> 

int helper(int n,int* arr){
    if(n==1){
        return 0;
    }
    if(arr[n]!=-1){
        return arr[n];
    }

    int a = helper(n-1,arr);
    int b = INT_MAX;
    if(n%2==0){
        b = helper(n/2, arr);
    }
    int c = INT_MAX;
    if(n%3==0){
        c = helper(n/3, arr);
    }

    arr[n] = min(a,min(b,c))+1;

    return min(a,min(b,c))+1;
}

int countStepsToOne(int n) {
    // Write your code here.
    int arr[n+1];

    for(int i=0;i<=n;i++){
        arr[i] = -1;
    }
    return helper(n,arr);
}
  • Dynamic Programming

#include <bits/stdc++.h> 

int countStepsToOne(int n) {
    // Write your code here.
    int arr[n+1];

    arr[1] = 0;

    for(int i=2;i<=n;i++){
        int a = arr[i-1];
        int b = INT_MAX;
        if(i%2==0){
            b = arr[i/2];
        }
        int c = INT_MAX;
        if(i%3==0){
            c = arr[i/3];
        }

        arr[i] = min(a,min(b,c))+1;
    }

    return arr[n];

}