Skip to content
Related Articles

Related Articles

Improve Article

Maximum profit after buying and selling the stocks with transaction fees | Set 2

  • Difficulty Level : Hard
  • Last Updated : 06 Sep, 2021

Given an array arr[] of positive integers representing prices of stocks and an integer transactionFee, the task is to find the maximum profit possible after buying and selling stocks any number of times and giving the transaction fee for each transaction.

Examples:

Input: arr[] = {6, 1, 7, 2, 8, 4}, transactionFee = 2
Output: 8
Explanation: 
A maximum profit of 8 can be obtained by two transactions.
Transaction 1: Buy at price 1 and sell at price 7. Profit = 7 – 1 – 2 = 4.
Transaction 2: Buy at price 2 and sell at price 8. Profit = 8 – 2 – 2 = 4.
Therefore, total profit = 4 + 4 = 8, which is the maximum possible.

Input: arr[] = {2, 7, 5, 9, 6, 4}, transactionFee = 1
Output: 7

Naive Approach: Refer to the previous post for the simplest approach to solve the problem.



Time Complexity: O(N2)
Auxiliary Space: O(1)

Efficient Approach: To optimize the above approach, the idea is to use Dynamic Programming. For each day, maintain the maximum profit, if stocks are bought on that day (buy) and the maximum profit if all stocks are sold on that day (sell). For each day, update buy and sell using the following relations:

buy = max(sell – arr[i], buy)
sell = max(buy +arr[i] – transactionFee, sell)

Below is the implementation of the above approach:

C++




// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the maximum
// profit with transaction fee
int MaxProfit(int arr[], int n,
              int transactionFee)
{
 
    int buy = -arr[0];
    int sell = 0;
 
    // Traversing the stocks for
    // each day
    for (int i = 1; i < n; i++) {
        int temp = buy;
 
        // Update buy and sell
        buy = max(buy, sell - arr[i]);
        sell = max(sell,
                   temp + arr[i] - transactionFee);
    }
 
    // Return the maximum profit
    return max(sell, buy);
}
 
// Driver code
int main()
{
    // Given Input
    int arr[] = { 6, 1, 7, 2, 8, 4 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int transactionFee = 2;
 
    // Function Call
    cout << MaxProfit(arr, n, transactionFee);
    return 0;
}

Java




// Java program for the above approach
import java.io.*;
 
class GFG
{
   
    // Function to find the maximum
    // profit with transaction fee
    static int MaxProfit(int arr[], int n,
                         int transactionFee)
    {
 
        int buy = -arr[0];
        int sell = 0;
 
        // Traversing the stocks for
        // each day
        for (int i = 1; i < n; i++) {
            int temp = buy;
 
            // Update buy and sell
            buy = Math.max(buy, sell - arr[i]);
            sell = Math.max(sell,
                            temp + arr[i] - transactionFee);
        }
 
        // Return the maximum profit
        return Math.max(sell, buy);
    }
 
    // Driver code
    public static void main(String[] args)
    {
       
        // Given Input
        int arr[] = { 6, 1, 7, 2, 8, 4 };
        int n = arr.length;
        int transactionFee = 2;
 
        // Function Call
        System.out.println(
            MaxProfit(arr, n, transactionFee));
    }
}
 
// This code is contributed by Potta Lokesh

Python3




# Python3 program for the above approach
 
# Function to find the maximum
# profit with transaction fee
def MaxProfit(arr, n, transactionFee):
     
    buy = -arr[0]
    sell = 0
 
    # Traversing the stocks for
    # each day
    for i in range(1, n, 1):
        temp = buy
 
        # Update buy and sell
        buy = max(buy, sell - arr[i])
        sell = max(sell, temp + arr[i] -
                   transactionFee)
 
    # Return the maximum profit
    return max(sell, buy)
 
# Driver code
if __name__ == '__main__':
     
    # Given Input
    arr = [ 6, 1, 7, 2, 8, 4 ]
    n = len(arr)
    transactionFee = 2
 
    # Function Call
    print(MaxProfit(arr, n, transactionFee))
     
# This code is contributed by SURENDRA_GANGWAR

C#




// C# program for the above approach
using System;
 
class GFG {
     
    // Function to find the maximum
    // profit with transaction fee
    static int MaxProfit(int[] arr, int n,
                         int transactionFee)
    {
 
        int buy = -arr[0];
        int sell = 0;
 
        // Traversing the stocks for
        // each day
        for (int i = 1; i < n; i++) {
            int temp = buy;
 
            // Update buy and sell
            buy = Math.Max(buy, sell - arr[i]);
            sell = Math.Max(sell,
                            temp + arr[i] - transactionFee);
        }
 
        // Return the maximum profit
        return Math.Max(sell, buy);
    }
     
    // Driver code
    public static void Main()
    {
       
        // Given Input
        int[] arr = { 6, 1, 7, 2, 8, 4 };
        int n = arr.Length;
        int transactionFee = 2;
 
        // Function Call
        Console.WriteLine(
            MaxProfit(arr, n, transactionFee));
    }
}
 
// This code is contributed by sanjoy_62.

Javascript




<script>
 
// JavaScript program for the above approach
 
// Function to find the maximum
// profit with transaction fee
function MaxProfit(arr, n, transactionFee)
{
    let buy = -arr[0];
    let sell = 0;
 
    // Traversing the stocks for
    // each day
    for(let i = 1; i < n; i++)
    {
        let temp = buy;
         
        // Update buy and sell
        buy = Math.max(buy, sell - arr[i]);
        sell = Math.max(sell,
                        temp + arr[i] - transactionFee);
    }
     
    // Return the maximum profit
    return Math.max(sell, buy);
}
 
// Driver Code
 
// Given Input
let arr = [ 6, 1, 7, 2, 8, 4 ];
let n = arr.length;
let transactionFee = 2;
 
// Function Call
document.write(
    MaxProfit(arr, n, transactionFee));
     
// This code is contributed by sanjoy_62
 
</script>
Output: 
8

 

Time Complexity: O(N)
Auxiliary Space: O(1)

 

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.




My Personal Notes arrow_drop_up
Recommended Articles
Page :