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