【LeetCode-Java实现】122. Best Time to Buy and Sell Stock II

122. Best Time to Buy and Sell Stock II

题目描述

Say you have an array for which the ith element is the price of a given stock on day i.
Design an algorithm to find the maximum profit. You may complete as many transactions as you like (i.e., buy one and sell one share of the stock multiple times).
Note: You may not engage in multiple transactions at the same time (i.e., you must sell the stock before you buy again).
Example 1:
Input: [7,1,5,3,6,4]
Output: 7
Explanation: Buy on day 2 (price = 1) and sell on day 3 (price = 5), profit = 5-1 = 4.
Then buy on day 4 (price = 3) and sell on day 5 (price = 6), profit = 6-3 = 3.
Example 2:
Input: [1,2,3,4,5]
Output: 4
Explanation: Buy on day 1 (price = 1) and sell on day 5 (price = 5), profit = 5-1 = 4.
Note that you cannot buy on day 1, buy on day 2 and sell them later, as you are
engaging multiple transactions at the same time. You must sell before buying again.
Example 3:
Input: [7,6,4,3,1]
Output: 0
Explanation: In this case, no transaction is done, i.e. max profit = 0.

股票买入卖出规则:
(1)先买入,才能卖出(即buy要在sell之前),可以买卖多次,但买入一个后必须卖出后才能继续买入,即不可以连续买入;
(2)买入时价格比卖出时便宜,卖出-买入=获得的收益(题目就是问最大收益是多少)。
若前面的日期没有一个是比后面的日期便宜的(可以理解为prices数组是递减的),就不买入,收益直接就是0

解题思路

既然不规定买卖次数,买入某支股票后,之后只要能赚钱就卖出,尽可能多地多买卖几次,最终得利益总和。
上述思路是典型的贪心算法------只关注局部最优解,来得到整体最优

附:贪心算法简介
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。迪杰斯特拉算法是贪心算法的一个典型案例。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

实现代码

根据上述思路可得Java代码:.

public int maxProfit(int[] prices) {
		//贪心算法
		int maxProfit=0;
		int temp=0;   //temp:当前如果能赚钱时,所获得的利益
		
		for(int i=0;i<prices.length-1;i++) {
			temp=prices[i+1]-prices[i];     //逐个遍历数组,连续的两天进行买卖操作,判断这两天是否能赚钱
			if(temp>0) {
				maxProfit+=temp;   //能赚钱就把收益算入总收益中
			}
		}
		return maxProfit;  //返回所有利益的总和
	}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值