当前位置:   article > 正文

Leetcode 121:买卖股票的最佳时机_leetcode 股票利润进行多次交易

leetcode 股票利润进行多次交易

原题:

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

注意你不能在买入股票前卖出股票。

示例 1:

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。

示例 2:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

解答:

1. 我的代码---时间复杂度O(n^2)
   这是最直观的一种思路,也就是遍历,找到最大的差就好了。
   这里需要注意的一点是对于数组算法题目,一定要先做如下判断:
  1. if (prices == null || prices.length < 1) {
  2. return 0;
  3. }

  1. class Solution {
  2.     public int maxProfit(int[] prices) {
  3.          if (prices == null || prices.length < 1) {
  4.             return 0;
  5.         }
  6.         int bene = 0;
  7.         for(int i = 0;i < prices.length;++i){
  8.             for(int j = i + 1;j < prices.length;++j){
  9.                 if(prices[j] - prices[i] > bene)
  10.                     bene = prices[j] - prices[i];
  11.             }
  12.         }
  13.         return bene;
  14.     }
  15. }

2. 范例程序---时间复杂度O(n)
    范例程序的min用来维护数组中的最小值,max用来维护最大收益。只用一重循环就完成了功能,这里min和max在一次遍历中更新的思想还是很赞的,时间复杂度O(n)。

  1. class Solution {
  2. public int maxProfit(int[] prices) {
  3. if (prices == null || prices.length < 1) {
  4. return 0;
  5. }
  6. int max = 0;
  7. int min = prices[0];
  8. for(int i = 0; i <prices.length ; i++){
  9. if (prices[i] < min)
  10. min = prices[i];
  11. else{
  12. if(max < prices[i] - min)
  13. max = prices[i] - min;
  14. }
  15. }
  16. return max;
  17. }
  18. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/499947
推荐阅读
相关标签
  

闽ICP备14008679号