假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益 
   1.你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖出一次,总共只能买入和卖出一次,且买入必须在卖出的前面的某一天 
   2.如果不能获取到任何利润,请返回0 
   3.假设买入卖出均无手续费
 
   数据范围: 
 
   要求:空间复杂度 ) ,时间复杂度
,时间复杂度 )
 
                                        [8,9,2,5,4,7,1]
5
在第3天(股票价格 = 2)的时候买入,在第6天(股票价格 = 7)的时候卖出,最大利润 = 7-2 = 5 ,不能选择在第2天买入,第3天卖出,这样就亏损7了;同时,你也不能在买入前卖出股票。
[2,4,1]
2
[3,2,1]
0
class Solution {
public:
    int maxProfit(vector<int> &prices) {
        int len = prices.size();
        int tempIncome = 0;
        int maxIncome = 0;
        for(int i=1;i<len;i++) {
            if(tempIncome < 0)
                tempIncome = prices[i] - prices[i-1];
            else
                tempIncome = tempIncome + prices[i] - prices[i-1];
            if(tempIncome > maxIncome)
                maxIncome = tempIncome;
        }
        return maxIncome;
    }
}; # # # @param prices int整型一维数组 # @return int整型 # class Solution: def maxProfit(self , prices ): # write code here lst = [] if len(prices) == 0 or len(prices)==1 : return 0 for i in range (len(prices)-1): for j in range(i+1,len(prices)): x = prices[j]-prices[i] lst.append(x) if max(lst)<=0: return 0 else: return max(lst)
# # # @param prices int整型一维数组 # @return int整型 # class Solution: def maxProfit(self , prices ): # write code here lst = [] if len(prices) == 0&nbs***bsp;len(prices)==1 : return 0 for i in range (len(prices)-1): for j in range(i+1,len(prices)): x = prices[j]-prices[i] lst.append(x) if max(lst)<=0: return 0 else: return max(lst)
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int min_price = prices[0]; // 最低价
        int max_money = 0; // 最高利润
        for (int i = 0; i < prices.size(); ++i) {
            min_price = min(min_price, prices[i]);
            max_money = max(prices[i] - min_price, max_money);
        }
        return max_money;
    }
}; import java.util.*;
public class Solution {
    /**
     * f(x) = prices[x] - min(price[0 ~ x-1])
     * f(1) = max(prices[1] - prices[0], 0);
     * f(0) = 0;
     * @param prices int整型一维数组 
     * @return int整型
     */
    public int maxProfit (int[] prices) {
        // write code here
        if(prices==null||prices.length <= 1){
            return 0;
        }
        
        int[] f = new int[prices.length];
        f[0] = 0;
        f[1] = Math.max(prices[1] - prices[0],0);
        int max = Math.max(f[0],f[1]);
        int min = Math.min(prices[1] , prices[0]);
        
        for(int x = 2; x < prices.length; x++){
            min = Math.min(min,prices[x]);
            max = Math.max(max,f[x] = prices[x] - min);
        }
        return max;
    }
} public class Solution {
    public int maxProfit(int[] prices) {
        if (prices.length<1) return 0;
        int sum = 0, min = prices[0];
        for (int i=0; i<prices.length; i++){
            if (prices[i] < min) min = prices[i];
            else if (prices[i] > min) sum = Math.max(sum, prices[i] - min);
        }
        return sum;
    }
}
 /*
	 * Runtime: Runtime: 1 ms.Your runtime beats 86.61 % of java submissions
	 */
	public int maxProfit(int[] prices) {
		if(prices==null||prices.length<2)
			return 0;
		int minNum=prices[0],maxPro=0;
		for(int i=1;i<prices.length;i++){
			if(prices[i]<minNum)
				minNum=prices[i];
			else if(prices[i]>minNum)
				maxPro=Math.max(maxPro, prices[i]-minNum);
		}
		
		return maxPro;
	}
public class Solution {
    public int maxProfit(int[] prices) {
        if(prices==null || prices.length<1)
                    return 0;    
      int maxProfit=0;    
      int minPrice=prices[0];    
      for(int i=1;i<prices.length;i++){   
      if(prices[i]-minPrice>maxProfit) 
                        maxProfit = prices[i]-minPrice;   
      else if(prices[i]<minPrice)    
      minPrice = prices[i];    
      }    
      return maxProfit;
    }
}
 public class Solution {
    public int maxProfit(int[] prices) {
        if(prices == null || prices.length==0)
            return 0;
        int min = prices[0];
        int res = 0;
        for(int i =1;i<prices.length;i++){
            if(prices[i]>min)
                res = res>prices[i]-min?res:prices[i]-min;
            else
                min = prices[i];
        }
        return res;
    }
}
 //贪心算法,从左往右遍历向量,遇到当前最小值,则保存,
//如果不是最小值,则计算它到最小值的距离,保存为最大利润
class Solution {
public:
    int maxProfit(vector<int> &prices) {
        int min_num = prices[0];
        int max_profit = 0;
        for(int i=1; i<prices.size(); ++i){
            if(prices[i]<min_num)
                min_num = prices[i];//更新最小值
            else
                max_profit = max(max_profit, prices[i]-min_num);
        }
        return max_profit;
    }
}; 思路如下:
    我们需要可以遍历这个数组,在遍历的同时维护一个变量min来记录当前为止,历史中的最小的价格(作为买入价格),之后我们用当前的价格减去这个买入的价格,就可以得到可以赚的价格,因此我们再来维护一个max来记录最高可赚的价格,遍历完成之后的max就是最终的结果,
代码如下,仅供参考:
int maxProfit(int *prices,int pricesSize){
    if(prices == NULL || pricesSize == 0)
        return 0;
    int min = prices[0];
    int max = -1;
    for(int i = 0;i < pricesSize; ++i){
        //min用来维护历史的最小值
        if(min > prices[i])
            min = prices[i];
        //max用来管理最大的利润
        if(max < prices[i] - min)
            max = prices[i] - min;
    }
    return max;
}
                                                                                    class Solution {
    /**
     *  找最小值和此后的最大值是最简单的
     *  为了方便理解后面系列题目,使用转移方程
     *  假设第i天持有股票的收益是 f(i,1), 未持有是f(i,0)
     *  f(i,0) = max(f(i-1, 0), f(i-1, 1)+prices[i])
     *  f(i,1) = max(f(i-1, 1), f(i-1, 0)-prices[i])
     *  对于f(i,1)因为只能买一次所以f(i-1,0)=0
     *  f(i,1) = max(f(i-1, 1), 0-prices[i])
     */
    public int maxProfit(int[] prices) {
        if(prices.length<2) return 0;
        int i0=0,i1=-prices[0];
        for(int i = 1; i < prices.length; i++){
            i0 = Math.max(i0, i1+prices[i]);
            i1 = Math.max(i1, -prices[i]);
        }
        return i0;
    }
} # # # @param prices int整型一维数组 # @return int整型 # class Solution: def maxProfit(self , prices ): # write code here if not prices&nbs***bsp;prices==1: return 0 min_p=prices[0] money=0 max_m=0 for p in prices: money = p-min_p if money<0: min_p=p if money>max_m: max_m=money return max_money
class Solution {
public:
    int maxProfit(vector<int> &prices) {
        int size = prices.size();
        if(size<=0) return 0;
        int max = 0;
        int gain = 0;
        for(int i=0;i<size;i++)
            for(int j=i;j<size;j++)
            {
                gain = prices[j]-prices[i];  //记录长和跌的情况
                if(max<gain)max = gain;  //与所有长幅相比,最后为最大收益
            }
        return max;
    }
};
 class Solution {
public:
    /**
     * 
     * @param prices int整型vector 
     * @return int整型
     */
    int maxProfit(vector<int>& prices) {
        int size = prices.size(),
            max = INT_MIN,
            dp = 0;
        
        if(size<2){
            return dp;
        }
        for(int i=0;i<size-1;i++){
            dp = dp + prices[i+1] - prices[i] > 0 ? dp + prices[i+1] - prices[i] : 0;
            max = dp > max ? dp : max;
        }
        
        return max;
    }
};