package _121;
import java.util.Map;
/**
* https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/
* 121. 买卖股票的最佳时机
* 给定一个数组 prices ,它的第i 个元素prices[i] 表示一支给定股票第 i 天的价格。
*
* 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
*
* 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
* 2022-08-28 15:50
*/
public class Test {
public static void main(String[] args) {
int prices[] = {7,1,5,3,6,4};
Solution s= new Solution();
System.out.println(s.maxProfit(prices));
}
}
/**
* 问题转化
* {0,-6,4,-2,3,-2} 寻找最大的连续子序列
*
* 和 53. 最大子数组和 差不多
*
* 思路1:
* 贪心算法
* 记录当前的利润,大于0,不然设置为第二天的数值
*
* 或者动态规划
* dp[i]表示第i天的最大利润
* if dp[i-1]>0 dp[i] = dp[i-1]+nums[i]
* else dp[i] = nums[i]
*/
class Solution2 {
public int maxProfit(int[] prices) {
int nums[] = new int[prices.length];
nums[0] = 0;
for(int i = 1;i< prices.length;i++){
nums[i] = prices[i]-prices[i-1];
}
int dp[] = new int[prices.length];
dp[0] = 0;
for(int i =1;i< nums.length;i++){
if(dp[i-1]>0){
dp[i] = dp[i-1]+nums[i];
}else{
dp[i] = nums[i];
}
}
int max = 0;
for (int e:dp) {
max = Math.max(max,e);
}
return max;
}
}
class Solution{
public int maxProfit(int[] prices) {
int nums[] = new int[prices.length];
nums[0] = 0;
for(int i = 1;i< prices.length;i++){
nums[i] = prices[i]-prices[i-1];
}
int max = nums[0];
int temp = nums[0];
for(int i = 1;i<nums.length;i++){
if(temp>0){
temp = temp+nums[i];
}else{
temp = nums[i];
}
max = Math.max(max,temp);
}
return max;
}
}
121. 买卖股票的最佳时机
最新推荐文章于 2024-07-24 14:54:00 发布