📉

LeetCode: 122. Best Time to Buy and Sell Stock II をGoで解く

2024/09/29に公開

LeetCodeの問題を解いたら、記録することにした。Goで解く。

問題

122. Best Time to Buy and Sell Stock II

日々の株価が入ったpricesという配列が与えられる。同日に売り買いしてもいい、かつ、期間内に複数回売買していい場合、利益は最大でいくら出せるかという問題。

例えば、prices = [7,1,5,3,6,4]なら、解は7(2日目に買って3日目に利確。4日目に買って5日目に利確)

難易度はmediumにカテゴライズされる。

制約

1 <= prices.length <= 3 * 104
0 <= prices[i] <= 104

売買が同じ日に発生してもいい。期間内に複数回売買してもいい。ただし、株は一個しか同時には持てない。

解いてみる

思いついた解き方

次の日に下がるなら(今日価格が上がりきっているなら)利確する。を繰り返すと最大利益になる。

これを実現すると以下コードとなった。「今日買ったことにしてしまう」とかはずるいかもしれない。

solution.go
func maxProfit(prices []int) int {
	var profit int
	boughtPrice := prices[0]
	for i := 1; i < len(prices); i++ {
		todayPrice := prices[i]
		// 最終日かつ利益が出るなら利確しておしまい
		isFinalDay := i == len(prices)-1
		if isFinalDay {
			if boughtPrice < todayPrice {
				profit += todayPrice - boughtPrice
			}
			break
		}

		// 今日をピークに明日値下がりするなら今日利確して、買い直す
		// you can buy it then immediately sell it on the same day.なのでOK
		tomorrowPrice := prices[i+1]
		if boughtPrice < todayPrice && todayPrice > tomorrowPrice {
			profit += todayPrice - boughtPrice
			boughtPrice = todayPrice
		}

		// 買ったときより今日のほうが安いなら、今日買ったことにしてしまう
		if boughtPrice > todayPrice {
			boughtPrice = todayPrice
		}
	}
	return profit
}

これを実行すると、ちゃんとPassした。

  • Runtime 4ms (Beats 64.31%)
  • Memory 3.34mb (Beats 73.04%)

また、pricesのサイズに依存したメモリ確保はしていないのと、pricesの一重ループをしているだけなので、

  • Time Complexity O(N)
  • Space Complexity O(1)

Discussion