代码自测(买卖股票的最佳时机)-2021-7-19

  1. 买卖股票的最佳时机
    给定一个数组 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,那么就不需要去相加,让数组本身不要变化。
将这个过程持续完,比较整个数组,最大的那个值就是最大的子段和

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值