Comprar acciones Vender para maximizar las ganancias

 

El costo de una acción en cada día se da en una array, encuentre la ganancia máxima que puede obtener comprando y vendiendo en esos días. Por ejemplo, si la array dada es {100, 180, 260, 310, 40, 535, 695}, la ganancia máxima se puede obtener comprando el día 0 y vendiendo el día 3. De nuevo, compre el día 4 y venda el día 6. Si el conjunto de precios dado se ordena en orden decreciente, entonces no se puede obtener ninguna ganancia.

Enfoque ingenuo: un enfoque simple es intentar comprar acciones y venderlas todos los días cuando sea rentable y seguir actualizando la ganancia máxima hasta el momento.

C++

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to return the maximum profit
// that can be made after buying and
// selling the given stocks
int maxProfit(int price[], int start, int end)
{
  
    // If the stocks can't be bought
    if (end <= start)
        return 0;
  
    // Initialise the profit
    int profit = 0;
  
    // The day at which the stock
    // must be bought
    for (int i = start; i < end; i++) {
  
        // The day at which the
        // stock must be sold
        for (int j = i + 1; j <= end; j++) {
  
            // If buying the stock at ith day and
            // selling it at jth day is profitable
            if (price[j] > price[i]) {
  
                // Update the current profit
                int curr_profit = price[j] - price[i]
                                  + maxProfit(price, start, i - 1)
                                  + maxProfit(price, j + 1, end);
  
                // Update the maximum profit so far
                profit = max(profit, curr_profit);
            }
        }
    }
    return profit;
}
  
// Driver code
int main()
{
    int price[] = { 100, 180, 260, 310,
                    40, 535, 695 };
    int n = sizeof(price) / sizeof(price[0]);
  
    cout << maxProfit(price, 0, n - 1);
  
    return 0;
}

C

// Importing the required header files
#include <stdio.h> 
  
// Creating MACRO for finding the maximum number
#define max(x, y)(((x) > (y)) ? (x) : (y)) 
  
// Creating MACRO for finding the minimum number 
#define min(x, y)(((x) < (y)) ? (x) : (y)) 
  
// Function to return the maximum profit
// that can be made after buying and
// selling the given stocks
int maxProfit(int price[], int start, int end)
{
  
    // If the stocks can't be bought
    if (end <= start)
        return 0;
  
    // Initialise the profit
    int profit = 0;
  
    // The day at which the stock
    // must be bought
    for (int i = start; i < end; i++) {
  
        // The day at which the
        // stock must be sold
        for (int j = i + 1; j <= end; j++) {
  
            // If buying the stock at ith day and
            // selling it at jth day is profitable
            if (price[j] > price[i]) {
  
                // Update the current profit
                int curr_profit = price[j] - price[i]
                                  + maxProfit(price, start, i - 1)
                                  + maxProfit(price, j + 1, end);
  
                // Update the maximum profit so far
                profit = max(profit, curr_profit);
            }
        }
    }
    return profit;
}
   
// Driver Code
int main()
{
    int price[] = { 100, 180, 260, 310,
                    40, 535, 695 };
    int n = sizeof(price) / sizeof(price[0]);
    printf("%d", maxProfit(price, 0, n - 1));
    return 0;
}

Java

// Java implementation of the approach
import java.util.*;
  
class GFG
{
  
// Function to return the maximum profit
// that can be made after buying and
// selling the given stocks
static int maxProfit(int price[], int start, int end)
{
  
    // If the stocks can't be bought
    if (end <= start)
        return 0;
  
    // Initialise the profit
    int profit = 0;
  
    // The day at which the stock
    // must be bought
    for (int i = start; i < end; i++) 
    {
  
        // The day at which the
        // stock must be sold
        for (int j = i + 1; j <= end; j++)
        {
  
            // If buying the stock at ith day and
            // selling it at jth day is profitable
            if (price[j] > price[i]) 
            {
  
                // Update the current profit
                int curr_profit = price[j] - price[i]
                                + maxProfit(price, start, i - 1)
                                + maxProfit(price, j + 1, end);
  
                // Update the maximum profit so far
                profit = Math.max(profit, curr_profit);
            }
        }
    }
    return profit;
}
  
// Driver code
public static void main(String[] args)
{
    int price[] = { 100, 180, 260, 310,
                    40, 535, 695 };
    int n = price.length;
  
    System.out.print(maxProfit(price, 0, n - 1));
}
}
  
// This code is contributed by PrinciRaj1992

Python3

# Python3 implementation of the approach
  
# Function to return the maximum profit
# that can be made after buying and
# selling the given stocks
def maxProfit(price, start, end):
  
    # If the stocks can't be bought
    if (end <= start):
        return 0;
  
    # Initialise the profit
    profit = 0;
  
    # The day at which the stock
    # must be bought
    for i in range(start, end, 1):
  
        # The day at which the
        # stock must be sold
        for j in range(i+1, end+1):
  
            # If buying the stock at ith day and
            # selling it at jth day is profitable
            if (price[j] > price[i]):
                  
                # Update the current profit
                curr_profit = price[j] - price[i] +\
                            maxProfit(price, start, i - 1)+ \
                            maxProfit(price, j + 1, end);
  
                # Update the maximum profit so far
                profit = max(profit, curr_profit);
  
    return profit;
  
# Driver code
if __name__ == '__main__':
    price = [100, 180, 260, 310, 40, 535, 695];
    n = len(price);
  
    print(maxProfit(price, 0, n - 1));
  
# This code is contributed by Rajput-Ji

C#

// C# implementation of the approach
using System;
  
class GFG
{
  
// Function to return the maximum profit
// that can be made after buying and
// selling the given stocks
static int maxProfit(int []price, int start, int end)
{
  
    // If the stocks can't be bought
    if (end <= start)
        return 0;
  
    // Initialise the profit
    int profit = 0;
  
    // The day at which the stock
    // must be bought
    for (int i = start; i < end; i++) 
    {
  
        // The day at which the
        // stock must be sold
        for (int j = i + 1; j <= end; j++)
        {
  
            // If buying the stock at ith day and
            // selling it at jth day is profitable
            if (price[j] > price[i]) 
            {
  
                // Update the current profit
                int curr_profit = price[j] - price[i]
                                + maxProfit(price, start, i - 1)
                                + maxProfit(price, j + 1, end);
  
                // Update the maximum profit so far
                profit = Math.Max(profit, curr_profit);
            }
        }
    }
    return profit;
}
  
// Driver code
public static void Main(String[] args)
{
    int []price = { 100, 180, 260, 310,
                    40, 535, 695 };
    int n = price.Length;
  
    Console.Write(maxProfit(price, 0, n - 1));
}
}
  
// This code is contributed by PrinciRaj1992

Javascript

<script>
  
// Javascript implementation of the approach
  
// Function to return the maximum profit
// that can be made after buying and
// selling the given stocks
function maxProfit( price, start, end)
{
  
    // If the stocks can't be bought
    if (end <= start)
        return 0;
  
    // Initialise the profit
    let profit = 0;
  
    // The day at which the stock
    // must be bought
    for (let i = start; i < end; i++) {
  
        // The day at which the
        // stock must be sold
        for (let j = i + 1; j <= end; j++) {
  
            // If buying the stock at ith day and
            // selling it at jth day is profitable
            if (price[j] > price[i]) {
  
                // Update the current profit
                let curr_profit = price[j] - price[i]
                                  + maxProfit(price, start, i - 1)
                                  + maxProfit(price, j + 1, end);
  
                // Update the maximum profit so far
                profit = Math.max(profit, curr_profit);
            }
        }
    }
    return profit;
}
  
    // Driver program 
      
    let price = [ 100, 180, 260, 310,
                    40, 535, 695 ];
    let n = price.length;
  
    document.write(maxProfit(price, 0, n - 1));
      
</script>

C++

// C++ Program to find best buying and selling days
#include <bits/stdc++.h>
using namespace std;
  
// This function finds the buy sell
// schedule for maximum profit
void stockBuySell(int price[], int n)
{
    // Prices must be given for at least two days
    if (n == 1)
        return;
  
    // Traverse through given price array
    int i = 0;
    while (i < n - 1) {
  
        // Find Local Minima
        // Note that the limit is (n-2) as we are
        // comparing present element to the next element
        while ((i < n - 1) && (price[i + 1] <= price[i]))
            i++;
  
        // If we reached the end, break
        // as no further solution possible
        if (i == n - 1)
            break;
  
        // Store the index of minima
        int buy = i++;
  
        // Find Local Maxima
        // Note that the limit is (n-1) as we are
        // comparing to previous element
        while ((i < n) && (price[i] >= price[i - 1]))
            i++;
  
        // Store the index of maxima
        int sell = i - 1;
  
        cout << "Buy on day: " << buy
             << "\t Sell on day: " << sell << endl;
    }
}
  
// Driver code
int main()
{
    // Stock prices on consecutive days
    int price[] = { 100, 180, 260, 310, 40, 535, 695 };
    int n = sizeof(price) / sizeof(price[0]);
  
    // Function call
    stockBuySell(price, n);
  
    return 0;
}
  
// This is code is contributed by rathbhupendra

C

// Program to find best buying and selling days
#include <stdio.h>
  
// solution structure
struct Interval {
    int buy;
    int sell;
};
  
// This function finds the buy sell schedule for maximum profit
void stockBuySell(int price[], int n)
{
    // Prices must be given for at least two days
    if (n == 1)
        return;
  
    int count = 0; // count of solution pairs
  
    // solution vector
    Interval sol[n / 2 + 1];
  
    // Traverse through given price array
    int i = 0;
    while (i < n - 1) {
        // Find Local Minima. Note that the limit is (n-2) as we are
        // comparing present element to the next element.
        while ((i < n - 1) && (price[i + 1] <= price[i]))
            i++;
  
        // If we reached the end, break as no further solution possible
        if (i == n - 1)
            break;
  
        // Store the index of minima
        sol[count].buy = i++;
  
        // Find Local Maxima.  Note that the limit is (n-1) as we are
        // comparing to previous element
        while ((i < n) && (price[i] >= price[i - 1]))
            i++;
  
        // Store the index of maxima
        sol[count].sell = i - 1;
  
        // Increment count of buy/sell pairs
        count++;
    }
  
    // print solution
    if (count == 0)
        printf("There is no day when buying the stock will make profitn");
    else {
        for (int i = 0; i < count; i++)
            printf("Buy on day: %dt Sell on day: %dn", sol[i].buy, sol[i].sell);
    }
  
    return;
}
  
// Driver program to test above functions
int main()
{
    // stock prices on consecutive days
    int price[] = { 100, 180, 260, 310, 40, 535, 695 };
    int n = sizeof(price) / sizeof(price[0]);
  
    // function call
    stockBuySell(price, n);
  
    return 0;
}

Java

// Program to find best buying and selling days
import java.util.ArrayList;
  
// Solution structure
class Interval {
    int buy, sell;
}
  
class StockBuySell {
    // This function finds the buy sell schedule for maximum profit
    void stockBuySell(int price[], int n)
    {
        // Prices must be given for at least two days
        if (n == 1)
            return;
  
        int count = 0;
  
        // solution array
        ArrayList<Interval> sol = new ArrayList<Interval>();
  
        // Traverse through given price array
        int i = 0;
        while (i < n - 1) {
            // Find Local Minima. Note that the limit is (n-2) as we are
            // comparing present element to the next element.
            while ((i < n - 1) && (price[i + 1] <= price[i]))
                i++;
  
            // If we reached the end, break as no further solution possible
            if (i == n - 1)
                break;
  
            Interval e = new Interval();
            e.buy = i++;
            // Store the index of minima
  
            // Find Local Maxima.  Note that the limit is (n-1) as we are
            // comparing to previous element
            while ((i < n) && (price[i] >= price[i - 1]))
                i++;
  
            // Store the index of maxima
            e.sell = i - 1;
            sol.add(e);
  
            // Increment number of buy/sell
            count++;
        }
  
        // print solution
        if (count == 0)
            System.out.println("There is no day when buying the stock "
                               + "will make profit");
        else
            for (int j = 0; j < count; j++)
                System.out.println("Buy on day: " + sol.get(j).buy
                                   + "        "
                                   + "Sell on day : " + sol.get(j).sell);
  
        return;
    }
  
    public static void main(String args[])
    {
        StockBuySell stock = new StockBuySell();
  
        // stock prices on consecutive days
        int price[] = { 100, 180, 260, 310, 40, 535, 695 };
        int n = price.length;
  
        // function call
        stock.stockBuySell(price, n);
    }
}
  
// This code has been contributed by Mayank Jaiswal

Python3

# Python3 Program to find 
# best buying and selling days
  
# This function finds the buy sell
# schedule for maximum profit
def stockBuySell(price, n):
      
    # Prices must be given for at least two days
    if (n == 1):
        return
      
    # Traverse through given price array
    i = 0
    while (i < (n - 1)):
          
        # Find Local Minima
        # Note that the limit is (n-2) as we are
        # comparing present element to the next element
        while ((i < (n - 1)) and 
                (price[i + 1] <= price[i])):
            i += 1
          
        # If we reached the end, break
        # as no further solution possible
        if (i == n - 1):
            break
          
        # Store the index of minima
        buy = i
        i += 1
          
        # Find Local Maxima
        # Note that the limit is (n-1) as we are
        # comparing to previous element
        while ((i < n) and (price[i] >= price[i - 1])):
            i += 1
              
        # Store the index of maxima
        sell = i - 1
          
        print("Buy on day: ",buy,"\t",
                "Sell on day: ",sell)
          
# Driver code
  
# Stock prices on consecutive days
price = [100, 180, 260, 310, 40, 535, 695]
n = len(price)
  
# Function call
stockBuySell(price, n)
  
# This is code contributed by SHUBHAMSINGH10

C#

// C# program to find best buying and selling days
using System;
using System.Collections.Generic;
  
// Solution structure
class Interval 
{
    public int buy, sell;
}
  
public class StockBuySell 
{
    // This function finds the buy sell 
    // schedule for maximum profit
    void stockBuySell(int []price, int n)
    {
        // Prices must be given for at least two days
        if (n == 1)
            return;
  
        int count = 0;
  
        // solution array
        List<Interval> sol = new List<Interval>();
  
        // Traverse through given price array
        int i = 0;
        while (i < n - 1) 
        {
            // Find Local Minima. Note that 
            // the limit is (n-2) as we are
            // comparing present element 
            // to the next element.
            while ((i < n - 1) && (price[i + 1] <= price[i]))
                i++;
  
            // If we reached the end, break 
            // as no further solution possible
            if (i == n - 1)
                break;
  
            Interval e = new Interval();
            e.buy = i++;
            // Store the index of minima
  
            // Find Local Maxima. Note that 
            // the limit is (n-1) as we are
            // comparing to previous element
            while ((i < n) && (price[i] >= price[i - 1]))
                i++;
  
            // Store the index of maxima
            e.sell = i - 1;
            sol.Add(e);
  
            // Increment number of buy/sell
            count++;
        }
  
        // print solution
        if (count == 0)
            Console.WriteLine("There is no day when buying the stock "
                            + "will make profit");
        else
            for (int j = 0; j < count; j++)
                Console.WriteLine("Buy on day: " + sol[j].buy
                                + "     "
                                + "Sell on day : " + sol[j].sell);
  
        return;
    }
  
    // Driver code
    public static void Main(String []args)
    {
        StockBuySell stock = new StockBuySell();
  
        // stock prices on consecutive days
        int []price = { 100, 180, 260, 310, 40, 535, 695 };
        int n = price.Length;
  
        // function call
        stock.stockBuySell(price, n);
    }
}
  
// This code is contributed by PrinciRaj1992

Javascript

<script>
       // JavaScript program for the above approach
 
       // This function finds the buy sell
       // schedule for maximum profit
       function stockBuySell(price, n) {
           // Prices must be given for at least two days
           if (n == 1)
               return;
 
           // Traverse through given price array
           let i = 0;
           while (i < n - 1) {
 
               // Find Local Minima
               // Note that the limit is (n-2) as we are
               // comparing present element to the next element
               while ((i < n - 1) && (price[i + 1] <= price[i]))
                   i++;
 
               // If we reached the end, break
               // as no further solution possible
               if (i == n - 1)
                   break;
 
               // Store the index of minima
               let buy = i++;
 
               // Find Local Maxima
               // Note that the limit is (n-1) as we are
               // comparing to previous element
               while ((i < n) && (price[i] >= price[i - 1]))
                   i++;
 
               // Store the index of maxima
               let sell = i - 1;
 
               document.write(`Buy on day: ${buy}   
            Sell on day: ${sell}<br>`);
           }
       }
 
       // Driver code
 
       // Stock prices on consecutive days
       let price = [100, 180, 260, 310, 40, 535, 695];
       let n = price.length;
 
       // Function call
       stockBuySell(price, n);
 
   // This code is contributed by Potta Lokesh
 
   </script>

C++

#include <iostream>
using namespace std;
  
// Preprocessing helps the code run faster
#define fl(i, a, b) for (int i = a; i < b; i++)
  
// Function that return
int maxProfit(int* prices, int size)
{
    // maxProfit adds up the difference between
    // adjacent elements if they are in increasing order
    int maxProfit = 0;
    // The loop starts from 1
    // as its comparing with the previous
    fl(i, 1, size) if (prices[i] > prices[i - 1]) maxProfit
        += prices[i] - prices[i - 1];
    return maxProfit;
}
  
// Driver Function
int main()
{
    int prices[] = { 100, 180, 260, 310, 40, 535, 695 };
    int N = sizeof(prices) / sizeof(prices[0]);
    cout << maxProfit(prices, N) << endl;
    return 0;
}
// This code is contributed by Kingshuk Deb

C

// Importing the required header files
#include <stdio.h> 
  
// Creating MACRO for finding the maximum number
#define max(x, y)(((x) > (y)) ? (x) : (y)) 
  
// Creating MACRO for finding the minimum number 
#define min(x, y)(((x) < (y)) ? (x) : (y)) 
  
// Function that return
int maxProfit(int prices[], int size)
{
    
    // maxProfit adds up the difference between
    // adjacent elements if they are in increasing order
    int ans = 0;
    
    // The loop starts from 1
    // as its comparing with the previous
    for (int i = 1; i < size; i++)
    {
        // If the current element is greater than the previous
        // then the difference is added to the answer
        if (prices[i] > prices[i - 1])
            ans += prices[i] - prices[i - 1];
    }
  
    return ans;
}
   
// Driver Code
int main()
{
    int price[] = { 100, 180, 260, 310,
                    40, 535, 695 };
    int n = sizeof(price) / sizeof(price[0]);
    printf("%d", maxProfit(price, n));
    return 0;
}

Java

// Java program for the above approach
import java.io.*;
  
class GFG 
{
  
    static int maxProfit(int prices[], int size)
    {
      
        // maxProfit adds up the difference between
        // adjacent elements if they are in increasing order
        int maxProfit = 0;
      
        // The loop starts from 1
        // as its comparing with the previous
        for (int i = 1; i < size; i++)
            if (prices[i] > prices[i - 1])
                maxProfit += prices[i] - prices[i - 1];
        return maxProfit;
    }
  
// Driver code
    public static void main(String[] args)
    {
      
        // stock prices on consecutive days
        int price[] = { 100, 180, 260, 310, 40, 535, 695 };
        int n = price.length;
  
        // function call
        System.out.println(maxProfit(price, n));
    }
}
  
// This code is contributed by rajsanghavi9.

Python3

# Python3 program for the above approach
def max_profit(prices: list, days: int) -> int:
  
    profit = 0
  
    for i in range(1, days):
  
        # checks if elements are adjacent and in increasing order
        if prices[i] > prices[i-1]:
  
            # difference added to 'profit'
            profit += prices[i] - prices[i-1]
  
    return profit
  
# Driver Code
if __name__ == '__main__':
  
    # stock prices on consecutive days
    prices = [100, 180, 260, 310, 40, 535, 695]
  
    # function call
    profit = max_profit(prices, len(prices))
    print(profit)
  
    # This code is contributed by vishvofficial.

C#

// C# program for the above approach
using System;
  
class GFG{
  
static int maxProfit(int[] prices, int size)
{
      
    // maxProfit adds up the difference
    // between adjacent elements if they 
    // are in increasing order
    int maxProfit = 0;
  
    // The loop starts from 1 as its 
    // comparing with the previous
    for(int i = 1; i < size; i++)
        if (prices[i] > prices[i - 1])
            maxProfit += prices[i] - prices[i - 1];
              
    return maxProfit;
}
  
// Driver code
public static void Main(string[] args)
{
      
    // Stock prices on consecutive days
    int[] price = { 100, 180, 260, 310, 40, 535, 695 };
    int n = price.Length;
  
    // Function call
    Console.WriteLine(maxProfit(price, n));
}
}
  
// This code is contributed by ukasp

Javascript

<script>
// javascript program for the above approach
    function maxProfit(prices , size) {
  
        // maxProfit adds up the difference between
        // adjacent elements if they are in increasing order
        var maxProfit = 0;
  
        // The loop starts from 1
        // as its comparing with the previous
        for (i = 1; i < size; i++)
            if (prices[i] > prices[i - 1])
                maxProfit += prices[i] - prices[i - 1];
        return maxProfit;
    }
  
    // Driver code
      
        // stock prices on consecutive days
        var price = [ 100, 180, 260, 310, 40, 535, 695 ];
        var n = price.length;
  
        // function call
        document.write(maxProfit(price, n));
  
// This code is contributed by umadevi9616 
</script>

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *