149. 买卖股票的最佳时机
假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格。如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润。
样例
给出一个数组样例 [3,2,3,1,2], 返回 1
思想:写出其,每天的股票跌落数组[-1,1,-2,,1],然后求其最大子数组。
代码:
class Solution {
public:
/*
* @param prices: Given an integer array
* @return: Maximum profit
*/
int maxProfit(vector<int> &prices) {
// write your code here
if(prices.empty()||prices.size()==1)
return 0;
vector<int>price;
for(int i=0;i<prices.size()-1;i++)
{
price.push_back(prices[i+1]-prices[i]);
}
int sum=0,max=0;
for(int i=0;i<price.size();i++)
{
sum+=price[i];
if(max<sum)
{
max=sum;
}
if(sum<0)
{
sum=0;
}
}
return max;
}
};
思想二:对于每一天来说,它能得到的最大利益就是它和之前最低点的差
class Solution {
public:
/*
* @param prices: Given an integer array
* @return: Maximum profit
*/
int maxProfit(vector<int> &prices) {
// write your code here
int ret = 0;
if(prices.size()<2)
return ret;
int lowest = prices[0];
for(int i=1;i<prices.size();i++)
{
int cur = prices[i];
ret = max(ret,cur-lowest);
lowest = min(lowest,cur);
}
return ret;
}
};
150. 买卖股票的最佳时机 II
假设有一个数组,它的第i个元素是一个给定的股票在第i天的价格。设计一个算法来找到最大的利润。你可以完成尽可能多的交易(多次买卖股票)。然而,你不能同时参与多个交易(你必须在再次购买前出售股票)。
样例
给出一个数组样例[2,1,2,0,1], 返回 2
只要后一个数比前一个数大,就买,卖;
class Solution {
public:
/*
* @param prices: Given an integer array
* @return: Maximum profit
*/
int maxProfit(vector<int> &prices) {
// write your code here
int profit=0;
if(prices.size()<2)
return profit;
for(int i=1;i<prices.size();i++)
{
if(prices[i]>prices[i-1])
profit+=prices[i]-prices[i-1];
}
return profit;
}
};
买卖股票的最佳时机 III
假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格。设计一个算法来找到最大的利润。你最多可以完成两笔交易。
思路:最大子数组2的变形;
代码:
class Solution {
public:
/**
* @param prices: Given an integer array
* @return: Maximum profit
*/
int maxProfit(vector<int> &prices) {
// write your code here
if(prices.size()==0||prices.size()==1)
return 0;
vector<int>price;
for(int i=0;i<prices.size()-1;i++)
price.push_back(prices[i+1]-prices[i]);
if(price.size()==1)
{
if(price[0]>0)
return price[0];
else
return 0;
}
int sum=0;
int sum_max=0;
int maxvalue_left[price.size()-1]={0};
for(int i=0;i<price.size();i++)
{
sum+=price[i];
if(sum<0)
sum=0;
if(sum_max<sum)
sum_max=sum;
maxvalue_left[i]=sum_max;
}
sum=0;
sum_max=0;
int maxvalue_right[price.size()-1]={0};
for(int i=price.size()-1;i>=0;i--)
{
sum+=price[i];
if(sum<0)
sum=0;
if(sum_max<sum)
sum_max=sum;
maxvalue_right[i]=sum_max;
}
int res=0;
for(int i=0;i<price.size()-1;i++)
res=max(res,maxvalue_right[i+1]+maxvalue_left[i]);
return res;
}
};