本文參考自《劍指offer》一書,代碼採用Java語言。html
更多:《劍指Offer》Java實現合集 java
假設把某股票的價格按照時間前後順序存儲在數組中,請問買賣交易該股票可能得到的利潤是多少?例如一隻股票在某些時間節點的價格爲{9, 11, 8, 5,7, 12, 16, 14}。若是咱們能在價格爲5的時候買入並在價格爲16時賣出,則能收穫最大的利潤11。數組
遍歷每個數字,並保存以前最小的數字,二者差最大即爲最大利潤。
ide
值得注意的是,我本身一開始寫的代碼是默認不能虧本(便可以不買入賣出,利潤不能爲負數),因此比較簡單;但若是能夠虧本,最大利潤指的是最小的虧損,那麼要注意最小數字不能是最後一個。在下面的代碼中能夠注意比較兩種狀況的差異。能夠考慮的例子如 { 16, 11, 7, 4, 2, 1 }post
測試算例 測試
1.功能測試(數組遞增/遞減/無序)url
2.特殊測試(null,空數組)spa
3.邊界值測試(數組僅兩個數字)code
//題目:假設把某股票的價格按照時間前後順序存儲在數組中,請問買賣交易該股 //票可能得到的利潤是多少?例如一隻股票在某些時間節點的價格爲{9, 11, 8, 5, //7, 12, 16, 14}。若是咱們能在價格爲5的時候買入並在價格爲16時賣出,則能 //收穫最大的利潤11。 public class MaximalProfit { public static int MaxDiff(int[] arr) { if(arr==null || arr.length<2) return -1; //error int min=arr[0]; //最大利潤能夠是負數,只要虧損最小就行 int maxDiff=arr[1]-min; for(int i=1;i<arr.length;i++) { if(arr[i-1]<min) //保存「以前」最小數字 min=arr[i-1]; if(arr[i]-min>maxDiff) maxDiff=arr[i]-min; } //默認不能虧本,代碼簡單,上面複雜的代碼注意細節 // int maxDiff=0; // for(int i=1;i<arr.length;i++) { // if(arr[i]<min) // min=arr[i]; // else if(arr[i]-min>maxDiff) // maxDiff=arr[i]-min; // } return maxDiff; } //簡單快速測試下 public static void main(String[] args) { int[] arr1=null; System.out.println(MaxDiff(arr1)==-1); int[] arr2={ }; System.out.println(MaxDiff(arr2)==-1); int[] arr3={ 16, 16, 16, 16, 16 }; System.out.println(MaxDiff(arr3)==0); int[] arr4={ 1, 2, 4, 7, 11, 16 }; System.out.println(MaxDiff(arr4)==15); int[] arr5={ 16, 11, 7, 4, 2, 1 }; System.out.println(MaxDiff(arr5)==-1); int[] arr6={ 9, 11, 5, 7, 16, 1, 4, 2 }; System.out.println(MaxDiff(arr6)==11); int[] arr7={ 2,4}; System.out.println(MaxDiff(arr7)==2); int[] arr8={ 4,2}; System.out.println(MaxDiff(arr8)==-2); } }
true true true true true true true true
1.蠻力法時間複雜度爲O(n^2),確定不對。咱們從頭至尾遍歷,肯定規律。能夠發現找出以前的最小值便可。htm