大家好呀,今天我们看两道用贪心算法解的两道题,150道经典面试题中的买卖股票的最佳时期1和2。
1.买卖股票的最佳时期1
思路
对于这题,我们其实很容易想出暴力解,那就是从后往前找值,对于每一个值找出前面的值与他相差最大的数,也就是前面数据中最小的那个数。那么,这需要两个for循环来遍历数组,时间复杂度达到O(N^2),在力扣上会超时,因此,这个时候会用到贪心思想,想一想,我们第一次遍历数组,是不是每次增加1,那么第二个循环中数据也每次增加一个,因此,容易想到我们只需要把上一次数据中的最小值与新增的哪个数据比较大小,如果新增的数比原来小那么新的数据是最小值,否则还是原来的数据是最小值,通过这个思路可以把两个for循环优化成一个for循环,因此得到此题的解
代码实现
class Solution {
public int maxProfit(int[] prices) {
int min = prices[0];//用于找前面数据最小值
int profits =0;//利润
for (int i = 1; i < prices.length; i++) {
if(prices[i-1]<min){
min=prices[i-1];
}//找前面最小值
int x=prices[i]-min;//计算利润
if (x> profits) {
profits = x;
} //比较得出最大利润
}
return profits;
}
}
2.买卖股票的最佳时期2
思路
这题可以拆分成每天的盈利,对于每个可以盈利的日子都买入股票,然后累加,其实思路比第一题还简单,关键在于弄懂题意
代码实现
class Solution {
public int maxProfit(int[] prices) {
int profits = 0;
for (int i = 1; i < prices.length; i++) {
if (prices[i] <= prices[i - 1]) {
continue;
}不盈利的情况
int x = prices[i] -prices[i-1];
profits += x;
}
return profits;
}
}
也可以采用双指针形式,当后一个元素大于前一个时则快指针走,遇到后一个元素小于等于前一个时计算差值,并让慢指针走到快指针处,这种做法更能体现贪心,速度也会更快一些
class Solution {
public int maxProfit(int[] prices) {
int p = 0;
for (int i = 0; i < prices.length; i++) {
int j = i;
while (j + 1 < prices.length &&
prices[j] < prices[j + 1]) {
j++;
}
p += prices[j] - prices[i];
i = j;
}
return p;
}
}
结尾
本期博客就到这里啦,这种练科三耽误了一些时间,好在是顺利过了,后面一定会补上之前的进度,谢谢大家。