leetCode初級算法---買賣股票的最佳時機 II(Js版/兩種思路)

最近在家待業,無聊的時候刷刷LeetCode,看到一道超級熟悉算法題。因爲之前參加秋招,春招都遇到過,而且遇到過幾次。反正無聊也是無聊,那就再寫寫吧,順便開始寫寫博客(好久沒寫了),算這道題來寫博客的原因除了這題經常看見外,另外一個重要的原因是這題夠簡單,能夠寫寫玩玩。重新開始寫博客要從一篇簡單易懂的文章開始。一個還沒畢業的大學生要開始寫博客了!!!(好了,廢話完畢)。
先把題目粘上吧,我懶得寫(懶惰是工程師的第一生產力)

給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。
設計一個算法來計算你所能獲取的最大利潤。你可以儘可能地完成更多的交易(多次買賣一支股票)。
注意:你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。
示例 1: 輸入: [7,1,5,3,6,4] 輸出: 7 解釋:
在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。
隨後,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能獲得利潤 = 6-3 = 3 。
示例 2: 輸入: [1,2,3,4,5] 輸出: 4 解釋: 在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接連購買股票,之後再將它們賣出。
因爲這樣屬於同時參與了多筆交易,你必須在再次購買前出售掉之前的股票。
示例 3: 輸入: [7,6,4,3,1] 輸出: 0 解釋: 在這種情況下, 沒有交易完成, 所以最大利潤爲 0。

說說這題目,首先他要有收益的,而且要保證收益的最大化,那麼如果一整個星期的價格都在下降,那麼無論什麼時候買都是虧損的,所以交易沒有完成。
好了,開始講講解題思路,先講一種簡單理解一點的,如果通過畫圖,其實可以很容易得到答案,不信的話可以看下圖(以示例一爲例)
哈哈哈哈好看不,我畫的
雖然說懶惰是工程師的第一生產力,但我現在還是個學生,興趣是學生的驅動力,所以我還是畫了出來,雖然是醜了點吧,將就吧。
從畫圖可以發現,其實大的收益就是上升區間的總和,所以第一個上升的區間是5-1 = 4,第二個上升區間是6-3 = 3,即最大利益是4+3=7.。用js代碼來計算的話,代碼如下:

let arr1  = [7,1,5,3,6,4]
let arr2 = [1,2,3,4,5]
let arr3 = [7,6,4,3,1]
let arr4 = [1,7,3,4,5,2]
// arr 就是傳入的數組
function maxBenefit(arr){
    let max = 0 // 最大利益
    let count = 0 // 標識符,表示有一個未計算的遞增的區間
    let index = 0 // 表示上升區間的第一個元素在數組中的索引
    let length = arr.length // 這個不用解釋
    for(let i = 0;i<length-1;i++ ){
         // 如果當前元素比後一個元素大,且有一個遞增區間的話
         // 算這個遞增區間的增值,然後與前一個遞增區間相加,然後把count歸0,表示區間已計算
        if(arr[i] > arr[i+1]){  
            if(count){
                max = max + arr[i] - arr[index]
                count = 0
            }  
               index = i+1    
        } if(arr[i] < arr[i+1] && !count){
            count = 1
        }
    }
    if(count){ // 如果遍歷完成後,還有一個未計算的區間就計算該區間,這種情況一般是示例2的這種
       max = max + arr[length-1] -arr[index]
    }
    return max
}
console.log('測試1輸出:',maxBenefit(arr1))  // 7
console.log('測試2輸出:',maxBenefit(arr2))  // 4
console.log('測試3輸出:',maxBenefit(arr3))  // 0
console.log('測試4輸出:',maxBenefit(arr4))  // 8

第一種思路講完了,就來講講第二種思路。題目說儘可能多地買賣股票,也就是說可以當天賣出並當天買進。這樣就更好操作了。只要對比兩天價格有賺我就賣了,例如1,2,3,對比1跟2,有賺,那麼久1的時候買,2的時候賣,再對比2跟3,也是同樣的道理,因爲可以當天賣然後再當天買嘛。這也叫貪心策略。代碼實現如下:

function maxBenefit1(arr){
  let max = 0
  let length = arr.length;
  for(let i = 0; i<length-1; i++){
    if(arr[i]<arr[i+1]){
        max = max + arr[i+1] - arr[i]
    }
  }
console.log('測試1輸出:',maxBenefit1(arr1)) // 7
console.log('測試2輸出:',maxBenefit1(arr2)) // 4
console.log('測試3輸出:',maxBenefit1(arr3)) // 0
console.log('測試4輸出:',maxBenefit1(arr4)) // 8

好了,兩種接替思路都講完了,別人能不能看懂我也不知道,反正我是能看懂。
可能會有看到這篇博客的有緣人會講,這麼簡單的東西也好意思做爲一篇博客。有咩所謂,我就好久沒寫博客,寫一寫玩一玩。有位不知名的網友說過,開始寫博客要從一篇簡單易懂的博客開始。
學生黨,有其他想法或者有寫錯的歡迎指正~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章