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 :
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 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){ 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! People are also reading:
Leave a Comment on this Post