【Java】 劍指offer(63) 股票的最大利潤

 

本文參考自《劍指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

 

Java代碼

//題目:假設把某股票的價格按照時間前後順序存儲在數組中,請問買賣交易該股
//票可能得到的利潤是多少?例如一隻股票在某些時間節點的價格爲{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
MaximalProfit

 

收穫

  1.蠻力法時間複雜度爲O(n^2),確定不對。咱們從頭至尾遍歷,肯定規律。能夠發現找出以前的最小值便可。htm

 

更多:《劍指Offer》Java實現合集 

相關文章
相關標籤/搜索