买卖股票的最佳时机,前面买股票,后面卖股票,获得最高收益,记住只能买卖一次。
不断循环查找,存在大量冗余,算法复杂度
O(n2)
public class Solution {
public int maxProfit(int[] prices) {
if(prices==null || prices.length==1){
return 0;
}
int ans = Integer.MAX_VALUE;
for(int i=0;i<prices.length;i++){
for(int j=i+1;j<prices.length;j++){
if(prices[i]<prices[j])
ans = Math.min(ans,prices[i]-prices[j]);
}
}
if(ans<0)
return Math.abs(ans);
else
return 0;
}
}
修改:
根据买卖股票的特性,我们必须先低价买,再高价卖,这个找最大收益的过程实际上是找到目前为之的最低价。在遍历价格数组时,根据这个动态更新的最低价和当前的价格可以算出当前卖股票最大能赚多少钱。算法复杂度
O(n)
public class Solution {
public int maxProfit(int[] prices) {
int ans=0;
int minPrice = Integer.MAX_VALUE;
for(int i=0;i<prices.length;i++){
if(prices[i]<minPrice) minPrice = prices[i];
if(prices[i]-minPrice>ans) ans = prices[i]-minPrice;
}
return ans;
}
}
贪心算法,能赚就卖
public class Solution {
public int maxProfit(int[] prices) {
int ans=0;
if(prices==null || prices.length<=1)
return ans;
for(int i=1;i<prices.length;i++){
//如果后边的股票价格高于前面的则抛
if(prices[i]>prices[i-1])
ans = ans + prices[i]-prices[i-1];
}
return ans;
}
}