买卖股票的最佳时机—1:
题目:
假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格。
如果你最多只允许完成一次交易,设计一个算法来找出最大利润。
解法:
该题解法和最大连续子数组和的解法思路是一样的。
1、根据股票的利益意义,想要更多利益则值低时买进,值高时卖出。根据提供的股票价格不方便得出股票价格变化,对原数据进行计算:list[i] - list[i-1] = 股票的变化。变化为正时股票增长(存在利益),变化为负时股票为下跌(无利益)。
2、得到股票的变化值列表,即求最大子数组和,最后得到正解。
class Solution {
public int maxProfit(int[] prices) {
int[] pp = new int[prices.length];
for (int i=0; i<prices.length - 1; i++) {
pp[i] = prices[i + 1] - prices[i];
}
int maxSum = 0;
int temp = 0;
for ( int num : pp){
if(temp + num > 0){
temp += num;
} else {
temp = 0;
}
maxSum = maxSum > temp ? maxSum: temp;
}
return maxSum;
}
}
买卖股票的最佳时机 —2
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
示例 2:
输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
示例 3:
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
贪心算法,从前向后遍历,有收益的就算上
class Solution {
public int maxProfit(int[] prices) {
int sumPrices = 0;
for(int i=1; i<prices.length; i++){
if(prices[i] > prices[i-1]){
sumPrices += prices[i] - prices[i-1];
}
}
return sumPrices;
}
}