買賣股票的最佳時機-算法詳細分析

題目:買賣股票的最佳時機:

若是你最多隻容許完成一筆交易(即買入和賣出一支股票一次),設計一個算法來計算你所能獲取的最大利潤。java

注意:你不能在買入股票前賣出股票。算法

示例 1:數組

輸入: [7,1,5,3,6,4]
    輸出: 5
    解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 5 天(股票價格 = 6)的時候賣出,最大利潤 = 6-1 = 5 。

注意:利潤不能是 7-1 = 6, 由於賣出價格須要大於買入價格;同時,你不能在買入前賣出股票。設計

示例 2:code

輸入: [7,6,4,3,1]
    輸出: 0
    解釋: 在這種狀況下, 沒有交易完成, 因此最大利潤爲0
  • package com.test.day6_10;
    
    /**
    
     * @author cosefy
     * @date 2020/6/10
       */
       public class MaxProfit {
       public static void main(String[] args) {
           int[] nums = {2,8,4,3,1};
           int maxprofit = maxProfit_Test1(nums);
           System.out.println("最大獲利:"+maxprofit);
       }
    解法一:一次遍歷(無需輔助空間)

    思路:從頭遍歷數組,找當前最小值,每當遇到更大數值,比較差值與原先最大獲利,遇到更小值,就更換min。
    分析:時間複雜度O(n),空間複雜度O(1)。運行效率很高it

    public static int maxProfit_Test1(int[] nums){
        if (nums.length==0)
            return 0;
        int maxprofit= 0;
        int min = nums[0];
        for (int i = 0; i < nums.length; i++) {
            if (min < nums[i]) {
                maxprofit = (nums[i] - min) > maxprofit ? nums[i] - min : maxprofit;
            } else {
                min = nums[i];
            }
        }
        return maxprofit;
    }
    }
    解法二:暴力解法

    思路:雙重循環求得最大獲利
    分析:時間複雜度O(n*n),空間複雜度O(1).效率低class

相關文章
相關標籤/搜索