+1

Find max profit to buy and sell stock - 2 ways

Bài toán

Bạn được cung cấp một mảng số nguyên prices, trong đó prices[i] là giá của một cổ phiếu vào ngày thứ i.

Mỗi ngày, bạn có thể quyết định mua và/hoặc bán cổ phiếu. Tuy nhiên, bạn chỉ được giữ tối đa một cổ phiếu tại một thời điểm. Bạn cũng có thể mua và bán ngay trong cùng một ngày.

Hãy tìm và trả về lợi nhuận tối đa mà bạn có thể đạt được.

Ví dụ minh họa

Đầu vào: prices = [7, 1, 5, 3, 6, 4] Đầu ra: 7 Giải thích: Mua vào ngày 2 (giá = 1) và bán vào ngày 3 (giá = 5), lợi nhuận = 5 - 1 = 4. Mua vào ngày 4 (giá = 3) và bán vào ngày 5 (giá = 6), lợi nhuận = 6 - 3 = 3. Tổng lợi nhuận = 4 + 3 = 7.

Cách 1: Greedy algorithm

Độ phức tạp: Thời gian: 𝑂(𝑛) Không gian: O(1)

Ý tưởng: Nếu giá ngày sau cao hơn giá ngày trước, ta mua ở ngày trước và bán ở ngày sau để lấy lợi nhuận. Tích lũy lợi nhuận cho từng khoảng tăng giá.

def maxProfit(prices):
    profit = 0
    for i in range(1, len(prices)):
        if prices[i] > prices[i - 1]:  # Nếu giá tăng, ta thu lợi nhuận
            profit += prices[i] - prices[i - 1]
    return profit

Cách 2: Dynamic Programming

Ý tưởng: Dùng hai trạng thái: hold: Lợi nhuận tối đa khi đang giữ cổ phiếu. not_hold: Lợi nhuận tối đa khi không giữ cổ phiếu. Cập nhật hai trạng thái này theo từng ngày.

def maxProfit(prices):
    hold, not_hold = -float('inf'), 0  # Bắt đầu với trạng thái không có lợi nhuận
    for price in prices:
        hold = max(hold, not_hold - price) # Giữ hoặc mua mới
        not_hold = max(not_hold, hold + price)  # Giữ trạng thái hoặc bán
    return not_hold

References

https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/description/


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí