題目:買賣股票的最佳時機:
如果你最多只允許完成一筆交易(即買入和賣出一支股票一次),設計一個算法來計算你所能獲取的最大利潤。
注意:你不能在買入股票前賣出股票。
示例 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
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)。運行效率很高
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).效率低