I: Divide and Conquer
class Solution {
public:
int max_Diff(vector<int> &prices, int start, int end, int *max, int *min) {
if (start>=end) {
*max=*min=prices[start];
return 0;
}
int mid=(start+end)/2;
int leftMax=0,leftMin=0,rightMax=0,rightMin=0;
int leftDiff=max_Diff(prices, start, mid, &leftMax, &leftMin);
int rightDiff=max_Diff(prices, mid+1, end, &rightMax, &rightMin);
*max=(leftMax>rightMax)?leftMax:rightMax;
*min=(leftMin<rightMin)?leftMin:rightMin;
int maxDiff=rightMax-leftMin;
maxDiff=(maxDiff>leftDiff)?maxDiff:leftDiff;
maxDiff=(maxDiff>rightDiff)?maxDiff:rightDiff;
return maxDiff;
}
int maxProfit(vector<int> &prices) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (prices.size()<2) {
return 0;
}
int min=0,max=0;
return max_Diff(prices,0,prices.size()-1,&max,&min);
}
};
遍历一遍,每次用当前的减之前最小的是当前的最大利润,更新最大利润。
class Solution {
public:
int maxProfit(vector<int> &prices) {
int n=prices.size();
if (!n) return 0;
int max=0, min=prices[0];
for (int i=1; i<n; i++) {
if (prices[i]-min>max) {
max = prices[i]-min;
}
if (prices[i]<min) {
min=prices[i];
}
}
return max;
}
};
II: 所有差的和
class Solution {
public:
int maxProfit(vector<int> &prices) {
int n=prices.size();
if (n<2) return 0;
int res=0;
for (int i=1; i<n; i++) {
if (prices[i]>prices[i-1]) {
res += prices[i]-prices[i-1];
}
}
return res;
}
};
III:DP
class Solution {
public:
int maxProfit(vector<int> &prices) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(prices.size()<2) {
return 0;
}
int res=0;
vector<int> v1(prices.size());
vector<int> v2(prices.size());
int min=0;
for (int i=1; i<prices.size(); i++) {
if(prices[i]<prices[min]) {
min=i;
}
v1[i]=v1[i-1]>(prices[i]-prices[min])?v1[i-1]:(prices[i]-prices[min]);
}
int max=prices.size()-1;
for (int i=prices.size()-2; i>0; i--) {
if(prices[i]>prices[max]) {
max=i;
}
v2[i]=v2[i+1]>(prices[max]-prices[i])?v2[i+1]:(prices[max]-prices[i]);
}
for (int i=0; i<prices.size(); i++) {
res=res>(v1[i]+v2[i])?res:(v1[i]+v2[i]);
}
return res;
}
};
class Solution {
public:
int maxProfit(vector
&prices) {
int max=0, n=prices.size();
if (n==0) return 0;
int low=INT_MAX, high=prices[n-1];
vector
profit(n,0);
for (int i=0; i<n; i++) {
if (prices[i]
max) max=cur;
profit[i]=max;
}
for (int i=n-2; i>0; i--) {
if (prices[i]>high) high=prices[i];
int cur=profit[i-1]+high-prices[i];
if (cur>max) max=cur;
}
return max;
}
};