---
# System prepended metadata

title: HW3 - Q2
tags: [109-2, 演算法]

---

# HW3 - Q2
###### tags: `演算法`, `109-2`

:::success
https://hackmd.io/@Cing-Chen/S1XG_XQEO
:::

## Question 
**2. EXT 3-1**
In book 4.1(p.68)the author change stock buying problem into a maximum-subarray problem then use Divide-and-conquer to solve the problem，
Please proposed an O(n) Pseudo code algorithm to solve stock buying problem，which is no need of any transformation。

:::info
**Stock Buying Problem (P.68)**
You are allowed to buy one unit of stock only one time and then sell it at a later date, buying and selling after the close of trading for the day.
Your goal is to maximize your profit.
:::

## Mein Answer
### How
選舉最大的秘密就是，票多的贏、票少的輸
正如買股票也有秘密，低價買入、高價賣出，利用其中的價差賺錢

看懂這句話，這題就解完了
怎麼說？
- 先低價買入 → 買入才能賣出
- 找到高點賣出 → 在頂點的時候賣出 / 可以決定哪時候賣出
- 利用價差賺錢 → 比較哪段時間能賺最多

所以，演算法可以長這樣
- 設 預定買入、預定賣出、最大收益 三個變數，起始都是 0 或更小的數
- 爬價格陣列，如果`t=i`時比我預定買入還低 (找到更便宜的買入點)
    - 把`t=i`設為預定買入點 (當然要買)
    - 把`t=i+1`也就是他的下一時間設為預定賣出 (不能回到過去賣)
    - 比較這樣做的話，收益會不會比較多
- 而如果`t=i`時比我預定賣出還高 (更好的價格)
    - 把`t=i`設為預定賣出
    - (因為我們手上有股票，可以決定咬不要留著，所以不用改預定買入點)
    - 一樣比較收益化

![](https://i.imgur.com/NHqmKzL.png)



### What
```js=
function max_profit(prices) 
{
    let maxProfit = 0
    let currentBuy = 0
    let currentSell = 0
    for(let i = 0; i < prices.length + 1; i++)
    {
        if(prices[i] < currentBuy)
        {
            currentBuy = prices[i]
            currentSell = prices[i + 1]
            if(currentSell - currentBuy > maxProfit)
                maxProfit = currentSell - currentBuy
        } 
        else if(prices[i] > currentSell)
        {
          currentSell = prices[i]
          if(currentSell - currentBuy > maxProfit)
                maxProfit = currentSell - currentBuy
        }
    return maxProfit
}
```
可以很簡單的看出我們只用一個迴圈爬過去。無庸置疑，複雜度是O(n)