- 买卖股票的最佳时机
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
package com.qianfeng.day05;
public class LeetCodeTest03_1 {
public static void main(String[] args) {
int[] a = {3,2,6,5,0,3};
Solution4 solution4 = new Solution4();
System.out.println(solution4.maxProfit(a));
}
}
class Solution4 {
public int maxProfit(int[] prices) {
int[] copy = new int[prices.length];
for (int i = 0; i < copy.length; i++) {
copy[i] = prices[i];
}
for (int i = 1; i < prices.length; i++) {
copy[i] = prices[i] - prices[i-1];
}
int max = 0;
copy[0] = 0;
for (int i = 1; i < prices.length; i++) {
if (copy[i-1] > 0) {
copy[i] = copy[i-1] + copy[i];
}
}
for (int i = 0; i < copy.length; i++) {
if (copy[i] > max) {
max = copy[i];
}
}
return max;
}
}
算法思路
在这个题目中,从第一天到最后一天,我将没两天设置为一个小段,让后一天的价格减去前一天的价格,这样做可以明显的看出这两天的涨幅情况,一旦得到的数值大于0,那么就说明在这一天里面是涨的,而且将涨的这个金额作为新的数组
在新的数组当中,问题就变为了求最大的子段和,只要那一段和最大,那么这个最大值就是相对来说赚的最多的那个值。
求最大子段和:在这个过程中从数组的第一个数开始,如果他前面一个数大于零那么他加上这个数一定会让总和增加,所以将此个数组上面的数被替换为相加后的数,一旦小于0,那么就不需要去相加,让数组本身不要变化。
将这个过程持续完,比较整个数组,最大的那个值就是最大的子段和