The Stock Span Problem

By | June 9, 2021

The Stock Span Problem is one of the famous financial problems where we have a list of prices of stocks of consecutive n days and we have to calculate the span of stock’s price for all the n days. The span of a particular day is defined as a maximum number of consecutive days before the day, for which the price of the stock on a particular day is less than or equal to the current day.

For Example:

Vamware

Consider an array containing the price of sock for the 7 consecutive days .{200,60,140,120,150,170}, the span of these stocks for particular days will be {1,1,1,2,1,4, 6 }.

Input: {100,80,60,70,60,75}

Output: {1,1,1,2,1,4 }

Approach: (Naive Approach)

  • This is a simple approach to solve this problem where we use two nested loops and check the price of all consecutive days before the current days.
  • Calculate the consecutive number of days on which the price of the stack is smaller or equal to the current day’s stock price.
  • Store the count of the number of days in an array or list.
  • Return the array/List.

Java Programing

//Importing libraries
import java.util.*;
import java.io.*;
//Main class
class Main1{
//Function to print the span details of the stock
static void print(int span[]){
    for(int details_:span){
        System.out.print(details_+" ");
    }
}
//Function to calculate the stock span
static int [] calulate_stockspan(int price_stock[],int length){
//Checking the base condition   
    if(length==0){
        return null ;
    }
//Creating an array to store the details of the stock    
    int span[]=new int[length];
//Minimum span will be 1    
    Arrays.fill(span, 1);
    for(int i=0;i<price_stock.length;++i){ int count=1; for(int j=i-1;j>=0;--j){
        //Checking the condition of the stock
             if(price_stock[j]<=price_stock[i]){
            //Increment the value     
           ++count;
          }
          else{
              break;
          }
        }
        //Store the details of the span
        span[i]=count;
    }
    //Return the span details
    return span;
}    
public static void main(String args[]){
//Array  containing stock price    
int price_stock[]={100,80,60,70,60,75};
//Length of the array
int length=price_stock.length;
//Function to calculate the span
int span[]=calulate_stockspan(price_stock, length);
//Print the span details
System.out.println("Stock_Span");
print(span);   
}
}

Output:

Python Programming

#Function to calculate the span details
def calulate_stockspan(price_stock,length):
    #Checking the base condition
    if(length==0):
        return 0
    else:
        span=[]
        for i in range(len(price_stock)):
            count=1
            j=i-1
            while j>=0:
                #Checking the condition of the stock
                if(price_stock[j]<=price_stock[i]):
                    #Increment the value  
                    count=count+1
                else:
                    break
                j=j-1
            #Insert the count   
            span.insert(i,count)
    #Return the span details            
    return span               

def main():
    #List  containing stock price    
    price_stock=[100,80,60,70,60,75]
    #Length of the list
    length=len(price_stock)
    print("Printing the details of the span")
    span=calulate_stockspan(price_stock, length)
    print(span)
main()

Output:

C++ Programming

 //Importing the libraries
# include<iostream>
# include <conio.h>
#include <bits/stdc++.h>
using namespace std;
//Function to calculate the span of the stock price on a particular day
void calulate_stockspan(int price_stock[],int length,int span[]){
//Checking the base condition
    if(length==0){
        return ;
    }


    for(int i=0;i<length;++i){ int count_=1; for(int j=i-1;j>=0;--j){
        //Checking the condition of the stock
             if(price_stock[j]<=price_stock[i]){
            //Increment the value
           ++count_;
          }
          else{
              break;
          }
        }
        //Store the details of the span
        span[i]=count_;

    }
    //Return the span details

}
void print(int span[],int length){

for(int i=0;i<length;++i){
    cout<<span[i]<<" ";
}
}
int main(){
//Array  containing stock price
int price_stock[]={100,80,60,70,60,75};
//Length of the array
int length=sizeof(price_stock)/sizeof(price_stock[0]);


//Creating an array to store the details of the stock
int span[length];
//Function to calculate the span

calulate_stockspan(price_stock, length,span);
//Print the span details
printf("%s\n","Printing Spanning details");
print(span,length);
return 0;
}

Output:

Complexity:

  • Time Complexity: The Time complexity of this approach is O(n^n).
  • Space Complexity: The Space Complexity of this approach is O(n).

Approach 2: (Optimised Approach)

  • In this approach, we will use the stack data structure because of the LIFO property, which is the “Last in First out” of the stack data structure.
  • Pop all indexes from the stack until the current index stock price becomes smaller than the upcoming index value from the stack.
  • Check two conditions, if the stack is empty, the answer will be current index value+1.
  • Otherwise, the answer will be the current index-peak element of the stack(span of stock).
  • Push the current index into the stack.

C++ Programming

//Importing the libraries
# include <conio.h>
# include <iostream>
#include <bits/stdc++.h>
using namespace std;
//Function to calculate the span of the stock price
void calulate_stockspan(int price[],int length){

       //Creating stack to store the index of the stock price 
      stackst;
      //Creating Vector to store the span of particular price 
      vectorvc;
      for(int i=0;i<length;++i){
          //Checking the condition  
          while(!st.empty()&&(price[st.top()]<=price[i])){
              //pop the element 
              st.pop();
          } 
          //Checking if stack is empty or not
          if(st.empty()){
            //push the index into the vector
              vc.push_back(i+1);
              //Push  the index of the current element into the stack
              st.push(i);
          }
          else{
              vc.push_back(i-st.top());
               //Push  the index of the current element into the stack
              st.push(i);
          }
      }
      //Print the span details
      printf("%s\n","Printing Span details");
      for(int i=0;i<length;++i){
         //Printing the span details of the stock price   
    cout<<vc[i]<<" ";
}
}

int main(){
//Array  containing stock price
int price_stock[]={100,80,60,70,60,75};
//Length of the array
int length=sizeof(price_stock)/sizeof(price_stock[0]);

//Function to calculate the span

calulate_stockspan(price_stock, length);


return 0;

}

Output:

Java Programming

//Importing the libraries
import java.util.*;
//Creating class 
class Main1{
  //Function to print the span details of the stock
  static void print(int arr[]){
    for(int i=0;i<arr.length;++i){
      //Printing the span details
      System.out.print(arr[i]+" ");
    }
  }

  //Function to calculate the span details of the stock price
  static int [] span(int arr[],int length){
    //Creating stack to store the minimum stock price
    StackS=new Stack();
    //Creating array to store the span details
    int  span[]=new int[length];
    for(int i=0;i<length;++i){
      //Checking the condition
      while(!S.empty()&& arr[S.peek()]<=arr[i]){
        //Pop the index from the array
         S.pop();
      }
      //Checking the condition
      if(S.empty()){
        //Push the element into the stack
        S.add(i);
        //Update the array
        span[i]=i+1;
      }
      else{
       span[i]=i-S.peek();
       S.add(i);
      }
    }
    //Return the span array
    return span;
    
  }
  public static void main(String args[]){
    int arr[]={100,80,60,70,60,75,85};
    int  length=arr.length;
    //Call function to calculate the span details of the stock price and returning the array
    int span[]=span(arr,length);
    System.out.println("Printing the Span Details");
    print(span);
  }
}

Output:

Python Programming

#Function to calculate the span details
def calulate_stockspan(price_stock,length):
    #Checking the base condition
    if(length==0):
        return 0
    else:
  
      st=[]  
     #List for storting the span details   
      span=[]
      for i in range(len(price_stock)):
          #Pop the elements from the stack until the condition is true
          while(len(st)>0 and price_stock[st[-1]]<=price_stock[i]):
              st.pop()
        #Checking the base condition
          if(len(st)==0):
              #Append the new element details
              span.append(i+1)
              st.append(i)
          else:
              span.append(i-st[-1])
              st.append(i)    
          
    #Return the span details            
    return span               

def main():
    #List  containing stock price    
    price_stock=[100,80,60,70,60,75]
    #Length of the list
    length=len(price_stock)
    print("Printing the details of the span")
    span=calulate_stockspan(price_stock, length)
    print(span)
main()  

Output:

Complexity:

  • Time Complexity: The Time complexity of this approach is O(n).
  • Space Complexity: The Space Complexity of this approach is O(n).

Approach 3: (Recursive Approach)

  • In this approach, we use simple recursion to calculate the stock span of every stock price of a particular day.
  • Iterate a loop and call a recursive function to all previous indexes and count the total number of days for which the price of the current element is larger or equal to all previous consecutive days.
  • Store the count in an array.
  • Return the array. The array will contain all the span details of all the stock prices.

 

Java Programming

//Importing libraries
import java.util.*;
import java.io.*;
//Main class
class Main1{
//Function to print the span details of the stock
static void print(int span[]){
    for(int details_:span){
      //Printing the stock span
        System.out.print(details_+" ");
    }
}
static int span_recursive(int previous_index,int starting_index,int price_stock[],int price){
  //Checking base condition
  if(previous_index<0){ return 0; } //Checking the price of previous day stock if(price_stock[previous_index]>price){
    return 1;
  }
  //Call next previous day stock
  int span=1+ span_recursive(previous_index-1, starting_index, price_stock, price);
  //Return the answer
  return span;

}
//Function to calculate the stock span
static void calulate_stockspan(int price_stock[],int length,int starting_index,int span[]){
  
  for(int i=starting_index;i<length;++i){
    //Call recursive function to calculate individual stock span
    int ans=span_recursive(i-1,i,price_stock,price_stock[i]);
     span[i]=ans;
  }
}    
public static void main(String args[]){
//Array  containing stock price    
int price_stock[]={100,80,60,70,60,75};
//Length of the array
int length=price_stock.length;
int span[]=new int[length];
//Function to calculate the span
calulate_stockspan(price_stock, length,1,span);
//Print the span details
System.out.println("Printing stock span details");
span[0]=1;
print(span);
   
}
}

Output:

C++ Programming

//Importing the libraries
# include <iostream>
#include <bits/stdc++.h>
using namespace std;
 int span_recursive(int previous_index,int starting_index,int price_stock[],int price){
  //Checking base condition
  if(previous_index<0){ return 0; } //Checking the price of previous day stock if(price_stock[previous_index]>price){
    return 1;
  }
  //Call next previous day stock
  int span=1+ span_recursive(previous_index-1, starting_index, price_stock, price);
  //Return the answer
  return span;

}
//Function to calculate the span of the stock price on a particular day
void calulate_stockspan(int price_stock[],int length,int starting_index,int span[]){

  for(int i=starting_index;i<length;++i){
    //Call recursive function to calculate individual stock span
    int ans=span_recursive(i-1,i,price_stock,price_stock[i]);
     span[i]=ans;
  }
}
void print(int span[],int length){

for(int i=0;i<length;++i){
    cout<<span[i]<<" ";
}
}
int main(){
//Array  containing stock price
int price_stock[]={100,80,60,70,60,75};
//Length of the array
int length=sizeof(price_stock)/sizeof(price_stock[0]);


//Creating an array to store the details of the stock
int span[length];
//Function to calculate the span

calulate_stockspan(price_stock, length,1,span);
//Print the span details
printf("%s\n","Printing Spanning Values");
span[0]=1;
print(span,length);
return 0;
}

Output:

Python Programing

#Function to calculate the span details
def span_recursive(previous_index, starting_index, price_stock, price):
     #Checking the base condition
    if(previous_index<0): return 0 if(price_stock[previous_index]>price):
        return 1
    #Call to the previous day for the span    
    return 1+span_recursive(previous_index-1,starting_index,price_stock,price)
      

   
#Function to calculate the span of the stock
def calulate_stockspan(price_stock, starting_index,length, span):
    i=starting_index
   
    while(i<length):
        #Recursively call previous day
       ans=span_recursive(i-1,i,price_stock,price_stock[i])
       span.append(ans)
       i=i+1          

def main():
    #List  containing stock price    
    price_stock=[100,80,60,70,60,75]
    #Length of the list
    span=[]
    length=len(price_stock)
    print("Printing the details of the span")
    calulate_stockspan(price_stock, 1,length,span)
    print(span)
main()  

Output:

Complexity:

  • Time Complexity: The Time complexity of this approach is O(n^n).
  • Space Complexity: The Space Complexity of this approach is O(n).

Conclusion

The Stock Span Problem is one of the most interesting problems of Data structure. In this article, we have discussed three approaches to solve The Stock Span Problem. One is the naive approach, the next one is the recursive implementation of the naive approach, and the third one is the optimized approach of this problem using the stack data structure. There are so many variations that can be made from this problem and this problem is most commonly asked during technical interviews.

We hope this article will help you to understand the problem statement and you will be able to solve any other variation of this problem.

Happy Coding!

Leave a Reply

Your email address will not be published. Required fields are marked *