DSA/stacks/java/the-stock-span-problem.java

99 lines
2.7 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Stack ;
/**
* Problem statement :
* The stock span problem is a financial problem where we have a series of n daily price quotes for a stock
* and we need to calculate span of stocks price for all n days.
* The span Si of the stocks price on a given day i is defined as the maximum number of consecutive days just before the given day,
* for which the price of the stock on
* the current day is less than or equal to its price on the given day.
* For example, if an array of 7 days prices is given as {100, 80, 60, 70, 60, 75, 85}, then the span values for corresponding
* 7 days are {1, 1, 1, 2, 1, 4, 6}
*/
class The_Stock_Span_Problem extends stack{
public The_Stock_Span_Problem(int Max) {
super(Max);
}
/**
* this problem is being solved with stack abstract data type.
*/
public void problem(int[] price,int n,int[] span){
stack st = new stack(Max);
st.push(0);
//span of the first day is always going to be 1
span[0] = 1;
for (int i = 1;i < n;i ++){
span[i] = 1;
st.PrintStack();
while(!st.isEmpty() && price[st.top()] <= price[i]){
st.pop();
}
if (st.isEmpty()){
span[i] = i + 1;
}
else{
span[i] = i - st.top();
}
st.push(i);
}
printArray(span);
}
public void printArray(int[] span){
System.out.println("The span of the stock array :" + Arrays.toString(span));
}
/**
* This is a different approach that has slightly higher time complexity than the approach used above
* Both the methods are awesome and star struck but...xD
*/
public void alternate_approach(int[] price,int n,int[] span){
Stack<Integer> sta = new Stack<>();
span[0] = 1;
for (int i = 1;i < n;i++){
for (int j = 0;j < i;j++){
sta.push(j);
}
while(!sta.isEmpty() && price[sta.peek()] <= price[i]){
sta.pop();
}
if (sta.isEmpty()){
span[i] = i + 1;
}
else{
span[i] = i - sta.peek();
}
sta.clear();
}
printArray(span);
}
}
class Main {
//to test the span stock problem
public static void main(String[] args){
int[] price = { 10, 4, 5, 90, 120, 80 };
int n = price.length;
int[] span = new int[n];
The_Stock_Span_Problem prob = new The_Stock_Span_Problem(1000);
prob.alternate_approach(price,n,span);
}
}