zoukankan      html  css  js  c++  java
  • 每日一题

    题目信息

    • 时间: 2019-07-06

    • 题目链接:Leetcode

    • tag:动态规划

    • 难易程度:中等

    • 题目描述:

      假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?

    示例1:

    输入: [7,1,5,3,6,4]
    输出: 5
    解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
         注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
    

    示例2:

    输入: [7,6,4,3,1]
    输出: 0
    解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
    

    注意

    1. 0 <= 数组长度 <= 10^5
    

    解题思路

    本题难点

    共有 n 天,第 a 天买,第 b 天卖,则需保证 a<b ;可推出交易方案数共有:(n−1)+(n−2)+⋯+2+1=n(n−1)/2种,暴力法的时间复杂度为 O(n^2)。

    具体思路

    动态规划

    • 状态定义:设动态规划列表 dp ,dp[i] 代表以 prices[i] 为结尾的子数组的最大利润(以下简称为 前 i 日的最大利润 )。

    • 转移方程:由于题目限定 “买卖该股票一次” ,因此前 i 日最大利润 dp[i] 等于前 i−1 日最大利润 dp[i−1] 和第 i 日卖出的最大利润中的最大值。

      dp[i] = mac(dp[i -1],prices[i] - min(prices[0:i]))

    提示:由于 dp[i] 只与 dp[i−1] , prices[i] , cost 相关,因此可使用一个变量(记为利润 profit )代替 dp 列表。

    代码

    class Solution {
        public int maxProfit(int[] prices) {
            int cost = Integer.MAX_VALUE, profit = 0;
            for(int price : prices) {
                cost = Math.min(cost, price);
                profit = Math.max(profit, price - cost);
            }
            return profit;
        }
    }
    

    复杂度分析:

    • 时间复杂度 O(N) : 其中 N为 prices列表长度,动态规划需遍历 prices。
    • 空间复杂度 O(1) : 变量 cost和 profit 使用常数大小的额外空间。
  • 相关阅读:
    微信小程序 单选按钮 最佳
    微信小程序 单选按钮的实现
    微信小程序 单选框实现
    Java Code To Create Pyramid and Pattern
    Java language
    npm Err! Unexpected end of JSON input while parsing near
    Node.js Express FrameWork Tutorial
    Higher-Order Function Examples
    Create First HTTP Web Server in Node.js: Complete Tutorial
    Node.js NPM Tutorial: Create, Publish, Extend & Manage
  • 原文地址:https://www.cnblogs.com/ID-Wangqiang/p/13288123.html
Copyright © 2011-2022 走看看