Best Time to Buy and Sell Stock

来源:互联网 发布:软件项目介绍ppt模板 编辑:程序博客网 时间:2024/06/05 11:42

原文地址:https://leetcode.com/problems/best-time-to-buy-and-sell-stock/

Say you have an array for which the ith element is the price of a given stock on day i.

If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm to find the maximum profit.

Example 1:

Input: [7, 1, 5, 3, 6, 4]Output: 5max. difference = 6-1 = 5 (not 7-1 = 6, as selling price needs to be larger than buying price)

Example 2:

Input: [7, 6, 4, 3, 1]Output: 0In this case, no transaction is done, i.e. max profit = 0.

题目的可以抽象一句话:求一个数组中后面一个元素减去前面一个元素得到的差的最大值,如果这个差小于0,那么返回0,其他的就返回其本身。

一个数组:


A=[a1,a2,a3,......,an1,an]

其中存在这么两个元素aiaj,其中0i<jn,并且有:ajai比数组中任意两个元素akal的差都大,其中0j<kn的差都大。于是根据数组A我们可以得到数组B:


B=[a2a1,a3a2,a4a3,......,anan1,an]

我们可以看到数组B的任意连续子数组的和就是ajai,现在求得是ajai的最大值,也就是说求数组B中连续子数组的和的最大值,这个就变成了很经典的问题了,代码实现如下:

public class BestTimeToBuyAndSellStock {    public static int maxProfit(int[] prices) {        if (prices.length == 0)            return 0;        if (prices.length == 1)            return 0;        int[] np = new int[prices.length - 1];        for (int i = 0; i < prices.length - 1; i++) {            np[i] = prices[i + 1] - prices[i];        }        int maxProfit = maxSubArraySum(np);        return maxProfit > 0 ? maxProfit : 0;    }    public static int maxSubArraySum(int a[]) {        int size = a.length;        int max_so_far = 0, max_ending_here = 0;        for (int i = 0; i < size; i++) {            max_ending_here = max_ending_here + a[i];            if (max_ending_here < 0)                max_ending_here = 0;            if (max_so_far < max_ending_here)                max_so_far = max_ending_here;        }        return max_so_far;    }    public static void main(String[] args) {        int[] prices = {7, 6, 4, 3, 1};        System.out.println(maxProfit(prices));    }}
0 0
原创粉丝点击