Minimum steps in which N can be obtained using addition or subtraction at every step

Given N, print the sequence of a minimum number of steps in which N can be obtained starting from 0 using addition or subtraction of the step number.
Note: At each step, we can add or subtract a number equal to the step number from the current position. For example, at step 1 we can add 1 or -1. Similarly, at step 2 we add 2 or -2 and so on.
The below diagram shows all possible positions that can be reached from 0 in 3 steps by performing the specified operations.
Examples :Â
Input: n = -4
Output: Minimum number of Steps: 3
Step sequence: 1 -2 -3
Explanation:
Step 1: At step 1 we add 1 to move from 0 to 1.
Step 2: At step 2 we add (-2) to move from 1 to -1.
Step 3: At step 3 we add (-3) to move from -1 to -4.
Input: n = 11
Output: Minimum number of steps = 4
Step sequence: 1 -2 3 4 5
Approach: The approach to solve the above problem is to mark the step numbers where we have to subtract or add where if N is positive or negative respectively. If N is positive, add numbers at every step, until the sum exceeds N. Once the sum exceeds N, check if sum-N is even or not. If sum-N is even, then at step number (sum-N)/2, subtraction is to be done. If sum-N is an odd number, then check if the last step at which sum exceeded N was even or odd. If it was odd, perform one more step else perform two steps. If sum = N at any step, then addition or subtraction at every step will give the answer.Â
Let N = 11, then 1+2+3+4+5=15 exceeds 11. Subtract 15-11 to get 4, which is equivalent to performing subtraction at step 2. Hence the sequence of steps is 1 -2 3 4 5Â
Let N=12, then 1+2+3+4+5=15 exceeds 11. Subtract 15-12 to get 3, which cannot be performed at any step. So add two more steps, one is the 6th step and 7th step. The target is to make sum-N even, so perform addition at 6th step and subtraction at 7th step, which combines to subtract 1 from the sum. Now sum-N is even, 14-12=2 which is equivalent to performing subtraction at step 1. Hence the sequence of steps are -1 2 3 4 5 6 -7
Let N=20, then 1+2+3+4+5+6 exceeds 20. Subtract 21-20 to get 1, so add 7 to 21 to get 28. Performing addition at next step will do as (sum-n) is odd. sum-N gives 8 which is equivalent to performing subtraction at step 4. Hence the sequence of steps is 1 2 3 -4 5 6 7.Â
Below is the illustration of the above approach:Â Â
C++
// C++ program to print the sequence// of minimum steps in which N can be// obtained from 0 using addition or// subtraction of the step number.#include <bits/stdc++.h>using namespace std;Â
// Function to return the vector// which stores the step sequencevector<int> findSteps(int n){    // Steps sequence    vector<int> ans;Â
    // Current sum    int sum = 0;Â
    // Sign of the number    int sign = (n >= 0 ? 1 : -1);    n = abs(n);Â
    int i;    // Basic steps required to get sum >= required value.    for (i = 1; sum < n; i++) {        ans.push_back(sign * i);        sum += i;    }    cout << i << endl;Â
    // Reached ahead of N    if (sum > sign * n) {Â
        // If the last step was an odd number        if (i % 2) {            sum -= n;Â
            // sum-n is odd            if (sum % 2) {                ans.push_back(sign * i);                sum += i++;            }            // subtract the equivalent sum-n            ans[(sum / 2) - 1] *= -1;        }        else {            sum -= n;Â
            // sum-n is odd            if (sum % 2) {Â
                // since addition of next step and subtraction                // at the next step will give sum = sum-1                sum--;                ans.push_back(sign * i);                ans.push_back(sign * -1 * (i + 1));            }            // subtract the equivalent sum-n            ans[(sum / 2) - 1] *= -1;        }    }    // returns the vector    return ans;}Â
// Function to print the stepsvoid printSteps(int n){Â Â Â Â vector<int> v = findSteps(n);Â
    // prints the number of steps which is the size of vector    cout << "Minimum number of Steps: " << v.size() << "\n";Â
    cout << "Step sequence:";Â
    // prints the steps stored    // in the vector    for (int i = 0; i < v.size(); i++)        cout << v[i] << " ";}Â
// Driver Codeint main(){Â Â Â Â int n = 20;Â Â Â Â printSteps(n);Â Â Â Â return 0;} |
Java
// Java program to print the // sequence of minimum steps // in which N can be obtained // from 0 using addition or // subtraction of the step // number.import java.util.*;Â
class GFG{Â
// Function to return the// Arraylist which stores // the step sequencestatic ArrayList<Integer> findSteps(int n){    // Steps sequence    ArrayList<Integer> ans = new ArrayList<Integer>();Â
    // Current sum    int sum = 0;Â
    // Sign of the number    int sign = (n >= 0 ? 1 : -1);    n = Math.abs(n);Â
    int i;    // Basic steps required to    // get sum >= required value.    for (i = 1; sum < n; i++)     {        ans.add(sign * i);        sum += i;    }    System.out.println( i );Â
    // Reached ahead of N    if (sum > sign * n)     {Â
        // If the last step         // was an odd number        if (i % 2 != 0)         {            sum -= n;Â
            // sum-n is odd            if (sum % 2 != 0)             {                ans.add(sign * i);                sum += i++;            }                         // subtract the             // equivalent sum-n            ans.set((sum / 2) - 1,             ans.get((sum / 2) - 1) * -1);        }        else        {            sum -= n;Â
            // sum-n is odd            if (sum % 2 != 0)             {Â
                // since addition of next                 // step and subtraction at                // the next step will                // give sum = sum-1                sum--;                ans.add(sign * i);                ans.add(sign * -1 * (i + 1));            }                         // subtract the             // equivalent sum-n            ans.set((sum / 2) - 1,            ans.get((sum / 2) - 1) * -1);        }    }         // returns the Arraylist    return ans;}Â
// Function to print the stepsstatic void printSteps(int n){Â Â Â Â ArrayList<Integer> v = findSteps(n);Â
    // prints the number of steps     // which is the size of Arraylist    System.out.println("Minimum number " +                             "of Steps: " +                                 v.size());Â
    System.out.print("Step sequence:");Â
    // prints the steps stored    // in the Arraylist    for (int i = 0; i < v.size(); i++)        System.out.print(v.get(i) + " ");}Â
// Driver Codepublic static void main(String args[]){Â Â Â Â int n = 20;Â Â Â Â printSteps(n);}}// This code is contributed// by Arnab Kundu |
C#
// C# program to print the // sequence of minimum steps // in which N can be obtained // from 0 using addition or // subtraction of the step // number.using System;using System.Collections.Generic;Â
class GFG{Â
// Function to return the// Arraylist which stores // the step sequencestatic List<int> findSteps(int n){    // Steps sequence    List<int> ans = new List<int>();Â
    // Current sum    int sum = 0;Â
    // Sign of the number    int sign = (n >= 0 ? 1 : -1);    n = Math.Abs(n);Â
    int i;         // Basic steps required to    // get sum >= required value.    for (i = 1; sum < n; i++)     {        ans.Add(sign * i);        sum += i;    }    Console.WriteLine( i );Â
    // Reached ahead of N    if (sum > sign * n)     {Â
        // If the last step         // was an odd number        if (i % 2 != 0)         {            sum -= n;Â
            // sum-n is odd            if (sum % 2 != 0)             {                ans.Add(sign * i);                sum += i++;            }                         // subtract the             // equivalent sum-n            ans[(sum / 2) - 1]=             ans[(sum / 2) - 1] * -1;        }        else        {            sum -= n;Â
            // sum-n is odd            if (sum % 2 != 0)             {Â
                // since addition of next                 // step and subtraction at                // the next step will                // give sum = sum-1                sum--;                ans.Add(sign * i);                ans.Add(sign * -1 * (i + 1));            }                         // subtract the             // equivalent sum-n            ans[(sum / 2) - 1]=            ans[(sum / 2) - 1] * -1;        }    }         // returns the Arraylist    return ans;}Â
// Function to print the stepsstatic void printSteps(int n){Â Â Â Â List<int> v = findSteps(n);Â
    // prints the number of steps     // which is the size of Arraylist    Console.WriteLine("Minimum number " +                             "of Steps: " +                                 v.Count);Â
    Console.Write("Step sequence:");Â
    // prints the steps stored    // in the Arraylist    for (int i = 0; i < v.Count; i++)        Console.Write(v[i] + " ");}Â
// Driver Codepublic static void Main(String []args){Â Â Â Â int n = 20;Â Â Â Â printSteps(n);}}Â
// This code is contributed by Rajput-Ji |
Javascript
<script>Â
// Javascript program to print the sequence// of minimum steps in which N can be// obtained from 0 using addition or// subtraction of the step number.Â
// Function to return the vector// which stores the step sequencefunction findSteps(n){    // Steps sequence    var ans = [];Â
    // Current sum    var sum = 0;Â
    // Sign of the number    var sign = (n >= 0 ? 1 : -1);    n = Math.abs(n);Â
    var i;    // Basic steps required to get sum >= required value.    for (i = 1; sum < n; i++) {        ans.push(sign * i);        sum += i;    }    document.write( i + "<br>");Â
    // Reached ahead of N    if (sum > sign * n) {Â
        // If the last step was an odd number        if (i % 2) {            sum -= n;Â
            // sum-n is odd            if (sum % 2) {                ans.push(sign * i);                sum += i++;            }            // subtract the equivalent sum-n            ans[(sum / 2) - 1] *= -1;        }        else {            sum -= n;Â
            // sum-n is odd            if (sum % 2) {Â
                // since addition of next step and subtraction                // at the next step will give sum = sum-1                sum--;                ans.push(sign * i);                ans.push(sign * -1 * (i + 1));            }            // subtract the equivalent sum-n            ans[(sum / 2) - 1] *= -1;        }    }    // returns the vector    return ans;}Â
// Function to print the stepsfunction printSteps(n){Â Â Â Â var v = findSteps(n);Â
    // prints the number of steps which is the size of vector    document.write( "Minimum number of Steps: " + v.length + "<br>");Â
    document.write( "Step sequence:");Â
    // prints the steps stored    // in the vector    for (var i = 0; i < v.length; i++)        document.write( v[i] + " ");}Â
// Driver Codevar n = 20;printSteps(n);Â
// This code is contributed by itsok.</script> |
Python3
# Python3 program to print the sequence# of minimum steps in which N can be# obtained from 0 using addition or# subtraction of the step number.Â
# Function to return the # which stores the step sequencedef findSteps( n):    # Steps sequence    ans=[]Â
    # Current sum    sum = 0Â
    # Sign of the number    sign = 1 if n >= 0 else -1    n = abs(n)    i=1    # Basic steps required to get sum >= required value.    while sum<n :        ans.append(sign * i)        sum += i        i+=1         print(i)Â
    # Reached ahead of N    if (sum > sign * n) :Â
        # If the last step was an odd number        if (i % 2) :            sum -= nÂ
            # sum-n is odd            if (sum % 2) :                ans.append(sign * i)                sum += i                i+=1                         # subtract the equivalent sum-n            ans[int((sum / 2) - 1)] *= -1                 else :            sum -= nÂ
            # sum-n is odd            if (sum % 2) :Â
                # since addition of next step and subtraction                # at the next step will give sum = sum-1                sum-=1                ans.append(sign * i)                ans.append(sign * -1 * (i + 1))                         # subtract the equivalent sum-n            ans[int((sum / 2) - 1)] *= -1                  # returns the     return ansÂ
Â
# Function to pr the stepsdef prSteps(n):Â Â Â Â v = findSteps(n)Â
    # print the number of steps which is the size of     print("Minimum number of Steps:",len(v))Â
    print("Step sequence:",end="")Â
    # print the steps stored    # in the     for i in range(len(v)):        print(v[i],end=" ")Â
Â
# Driver Codeif __name__ == '__main__':Â Â Â Â n = 20Â Â Â Â prSteps(n) |
7 Minimum number of Steps: 7 Step sequence:1 2 3 -4 5 6 7
Â
Time Complexity : O(sqrt(N))Â
Auxiliary Space : O(sqrt(N))
Note: sum = i*(i+1)/2 is equivalent or greater than N, which gives i as sqrt(N).
Â
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!




