第四十六题
方法一 直接遍历两边 找最大值 显然不是最优解
class Solution {
public:
/**
*
* @param prices int整型vector
* @return int整型
*/
int maxProfit(vector<int>& prices) {
// write code here
// 第一种 O(n^2)直接二重循环 遍历 找最大值即可
int max=0;
for(int i=0;i<prices.size();i++)
{
int buy=prices[i];
for(int j=i;j<prices.size();j++){
int sale =prices[j];
max=max>sale-buy?max:sale-buy;
}
}
return max;
}
};
public:
/**
*
* @param prices int整型vector
* @return int整型
*/
int maxProfit(vector<int>& prices) {
// write code here
// 第一种 O(n^2)直接二重循环 遍历 找最大值即可
int max=0;
for(int i=0;i<prices.size();i++)
{
int buy=prices[i];
for(int j=i;j<prices.size();j++){
int sale =prices[j];
max=max>sale-buy?max:sale-buy;
}
}
return max;
}
};
方法二 贪心算法 当出现最小值的时候,更新最小值 再向后遍历
class Solution {
public:
/**
*
* @param prices int整型vector
* @return int整型
*/
int maxProfit(vector<int>& prices) {
// write code here
// 方法二 贪心算法 肯定是在最便宜的时候买入的,在最便宜后面最贵的时候卖出的
// 每次判断是否是最便宜的,如果是最便宜的 就更新最便宜的值
// 每次都是计算 当前值 减去最便宜的是不是赚的最多的
// 如果说是 50 100 2 3 10
// 那么 100-50=50 最大值是50
// 再往后 看到2 min更新为2
// 再往后价格 最大的差距也是以2为最小值 算出来的 最大差10-2=8 但是不如前面的50所以不更新
// 因为 如果经过2 以后 最小值不以2来算的话,后面无论什么价卖 都没有 以2买入的价格赚的多
// 再比如 刚才的例子变为 50 100 2 3 60
// 那么 到60的时候,赚的最多是60-2=58
int min = 9999;
int ans=0;
for(int i =0;i<prices.size();i++)
{
if(prices[i]<min)
min=prices[i];
if(prices[i]-min>ans)
ans=prices[i]-min;
}
return ans;
}
};
public:
/**
*
* @param prices int整型vector
* @return int整型
*/
int maxProfit(vector<int>& prices) {
// write code here
// 方法二 贪心算法 肯定是在最便宜的时候买入的,在最便宜后面最贵的时候卖出的
// 每次判断是否是最便宜的,如果是最便宜的 就更新最便宜的值
// 每次都是计算 当前值 减去最便宜的是不是赚的最多的
// 如果说是 50 100 2 3 10
// 那么 100-50=50 最大值是50
// 再往后 看到2 min更新为2
// 再往后价格 最大的差距也是以2为最小值 算出来的 最大差10-2=8 但是不如前面的50所以不更新
// 因为 如果经过2 以后 最小值不以2来算的话,后面无论什么价卖 都没有 以2买入的价格赚的多
// 再比如 刚才的例子变为 50 100 2 3 60
// 那么 到60的时候,赚的最多是60-2=58
int min = 9999;
int ans=0;
for(int i =0;i<prices.size();i++)
{
if(prices[i]<min)
min=prices[i];
if(prices[i]-min>ans)
ans=prices[i]-min;
}
return ans;
}
};