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

好了,两种接替思路都讲完了,别人能不能看懂我也不知道,反正我是能看懂。
可能会有看到这篇博客的有缘人会讲,这么简单的东西也好意思做为一篇博客。有咩所谓,我就好久没写博客,写一写玩一玩。有位不知名的网友说过,开始写博客要从一篇简单易懂的博客开始。
学生党,有其他想法或者有写错的欢迎指正~

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