• leecode刷题(2)-- 买卖股票的最佳时机


    买卖股票的最佳时机

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

    设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

    注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

    示例:

    输入: [7,1,5,3,6,4]
    输出: 7
    解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
    随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

    代码如下:

    public class MaxProfit {
    	public int maxProfit(int[] prices) {
    		if (prices == null || prices.length == 0) {
    			return 0;
    		}
    		int profit = 0;
    		for (int i = 1; i < prices.length; i++) {
    			if (prices[i-1] < prices[i]) {
    				profit += prices[i] - prices[i-1];
    			}
    		}
    		return profit;
    	}
    
    	public static void main(String[] args) {
    		int[] a = {1,2,3,4,9};
    		MaxProfit profit = new MaxProfit();
    		int maxProfit = profit.maxProfit(a);
    		System.out.println(maxProfit);
    	}
    }
    

    算法:贪心算法(局部最优解即为整体最优解)

    比如我们假定数组为 [7, 1, 5, 3, 6, 4]

    依照题目规定,要获得最大值的话,要求相邻子数组的差应该大于或等于0(这样才能“低买高卖”),也就是说,这个连续子数组应该是递增的。

    我们还是来看例子,依据“低买高卖”的原则,我们可以得到两种结果:

    (1) profit1 = (5-1) + (6-3) = 7

    (2) profit2 = (6-1) = 5

    第一种结果为相邻比大小并相减并连续求和,第二种为找到最大和最小值相减(遵循“低买高卖”),明显第一种更符合题目利益最大化的要求。

    然后我们继续优化,可以在数值递增的过程中连续取差值求和,而不用在数值停止递增找到最大值,这样我们的子数组便都是递增的了。如果子数组中的第二个数字大于第一个数字,我们便能获得该子数组的最大利润,推广到整个数组,我们将获得的总和将是最大利润。这便是贪心算法。

    复杂度

    • 时间复杂度:O(n) 。遍历一次。
    • 空间复杂度:O(1) 。需要常量的空间。
  • 相关阅读:
    python的多线程
    python的socket解析
    python的os.system函数的应用
    自动化测试的4种模型
    测试中的一些常见名词解析
    mysql存储过程详解
    mysql时间加减函数
    十周课程总结
    实验&报告7
    实验& 报告7
  • 原文地址:https://www.cnblogs.com/weixuqin/p/10140032.html
Copyright © 2020-2023  润新知