企业面试真题--002

股票最大利润

假设有一个数组, 它的第i个元素对应第i天的价格

最多只允许完成一次交易(买进一次,卖出一次)

设计一个算法找出最大利润

例如: [7,1,5,3,6,4] 最大利润 5

function maxIncome(prices) { 
   var 收益值 = 0; 
   var 买入时间 = 0; 
   var 最大收益 = 0; 
   for(var i = 1; i < prices.length; i++) { 
      //假设我们从第一天买入,收益为0, 循环从1开始,第二天计算收益 
      //当前收益值 
      收益值 = prices[i]-prices[买入时间]; 
      //若当前收益出现负数或0,则意味着有比买入价更低的价格出现 
      //我们开始计算下一个买入时间点 
      if(收益值<=0) 买入时间=i;
 
      //每次都将更大的收益保留 
      //若没有出现更大的收益,则不做更新 
      //最终,最大收益会被保留下来 
      
      if(收益值>=最大收益) 最大收益=收益值; 
      /* 唯一不足之处,是不太容易记录买入和卖出时机。 */ 
    } 
    return 最大收益; 
} 
console.log( maxIncome([7,1,5,3,6,4]) );

如果这个计算方法你不是非常能理解, 我们再来换一个简单一点的思路

 

function maxIncome(prices) { 
   var 最大收益 = 0; 
   for(var i = 0; i < prices.length-1; i++) { 
      for(var j = i+1; j < prices.length; j++) { 
        //就是穷举每个买入及卖出的差价 
        var 收益值 = prices[j] - prices[i]; 
        if(收益值>=最大收益) 最大收益 = 收益值; 
       } 
    } 
    return 最大收益; 
} 
console.log( maxIncome([7,1,5,3,6,4]) );

 

这个思路虽然简单, 但浪费了很多计算次数

优化改良之后, 就是开头的版本了


文章转载自知乎: 千锋HTML5学院
原文链接:企业面试真题--005

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值