当前位置: 首页 > news >正文

注册公司查名字哪个网站广告联盟平台排名

注册公司查名字哪个网站,广告联盟平台排名,上街网络推广,做企业网站都有什么平台目录 LeetCode:121. 买卖股票的最佳时机 暴力解法 贪心法 动态规划法 LeetCode:122.买卖股票的最佳时机II 基本思路 LeetCode: 买卖股票的最佳时机III、IV 基本思路 C代码 LeetCode:121. 买卖股票的最佳时机 力扣题目链接 文字讲解:121. 买卖股票的最佳时…

目录

LeetCode:121. 买卖股票的最佳时机

暴力解法

贪心法

动态规划法

LeetCode:122.买卖股票的最佳时机II

基本思路

LeetCode:  买卖股票的最佳时机III、IV

基本思路

C++代码


LeetCode:121. 买卖股票的最佳时机

力扣题目链接

文字讲解:121. 买卖股票的最佳时机

视频讲解:动态规划之 LeetCode:121.买卖股票的最佳时机1

暴力解法

class Solution {
public:int maxProfit(vector<int>& prices) {int result = 0;for (int i = 0; i < prices.size(); i++) {for (int j = i + 1; j < prices.size(); j++){result = max(result, prices[j] - prices[i]);}}return result;}
};

        但是很容易看出时间复杂度为O(n^2)----超时!

贪心法

        因为股票就买卖一次,那么贪心的想法很自然就是取最左最小值,取最右最大值,那么得到的差值就是最大利润。

class Solution {
public:int maxProfit(vector<int>& prices) {int low = INT_MAX;int result = 0;for (int i = 0; i < prices.size(); i++) {low = min(low, prices[i]);  // 取最左最小价格result = max(result, prices[i] - low); // 直接取最大区间利润}return result;}
};

动态规划法

动规五部曲分析如下:

  • 确定dp数组(dp table)以及下标的含义

        dp[i][0]表示第i天持有股票(当然也可以表示为不持有股票,但如果这样设置那么在确定递推公式时连续性不明显,在最佳时机III中能比较明显的体会到)所得最多现金。dp[i][1]表示第i天不持有股票所得最多现金。

  • 确定递推公式

        dp[i][0]和dp[i][1]应该分开计算。

        对于dp[i][0]来说,存在两种情况,一种是第i-1天同样持有股票,另一种是第i-1天不持有股票,在第i天买入,此时dp[i][0] = max(dp[i-1][0],dp[i-1][1] - price[i]);

        同理,对于dp[i][1]同样有两种情况,dp[i][1] = max(dp[i-1][1],dp[i-1][0] + price[i]);

  • dp数组如何初始化

        由递推公式可以看出,其基础都是要从dp[0][0]和dp[0][1]推导出来的,所以dp[0][0]表示第一天持有股票,即第一天买入,此时最大金额为-price[0];dp[0][1]表示第一天不持有股票,即为初试金额0。

  • 确定遍历顺序

        从递推公式可以看出dp[i]都是由dp[i - 1]推导出来的,那么一定是从前向后遍历。

  • 举例推导dp数组

        以示例1,输入:[7,1,5,3,6,4]为例,dp数组状态如下:

        显然,最后的结果一定是dp[5][0]和dp[5][1]中的一个结果,那么应该选择哪一个呢?其实仔细想想很容易得出,持有股票所拥有的金额一定小于不持有股票的金额,因此最后返回值为dp[5][1]。

// 版本一
class Solution {
public:int maxProfit(vector<int>& prices) {int len = prices.size();if (len == 0) return 0;vector<vector<int>> dp(len, vector<int>(2));dp[0][0] -= prices[0];dp[0][1] = 0;for (int i = 1; i < len; i++) {dp[i][0] = max(dp[i - 1][0], -prices[i]);dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);}return dp[len - 1][1];}
};

        当然这样的时间复杂度和空间复杂度都是O(n)。从递推公式可以看出,dp[i]只是依赖于dp[i - 1]的状态。那么我们只需要记录 当前天的dp状态和前一天的dp状态就可以了,可以使用滚动数组来节省空间。

// 版本二
class Solution {
public:int maxProfit(vector<int>& prices) {int len = prices.size();vector<vector<int>> dp(2, vector<int>(2)); // 注意这里只开辟了一个2 * 2大小的二维数组dp[0][0] -= prices[0];dp[0][1] = 0;for (int i = 1; i < len; i++) {dp[i % 2][0] = max(dp[(i - 1) % 2][0], -prices[i]);dp[i % 2][1] = max(dp[(i - 1) % 2][1], prices[i] + dp[(i - 1) % 2][0]);}return dp[(len - 1) % 2][1];}
};

LeetCode:122.买卖股票的最佳时机II

力扣题目链接

文字讲解:LeetCode:122.买卖股票的最佳时机II

视频讲解:动态规划,股票问题第二弹 | LeetCode:122.买卖股票的最佳时机II

基本思路

        和买卖股票的最佳时机的步骤基本一致,不同点在于本题可以不限次数的购买股票,因此递推公式需要进行改变:

dp[i][0] = max(dp[i-1][0],dp[i-1][1] + prices[i]);

dp[i][1] = max(dp[i-1][1],dp[i-1][0] - prices[i]);

class Solution {
public:int maxProfit(vector<int>& prices) {int len = prices.size();vector<vector<int>> dp(len, vector<int>(2, 0));dp[0][0] -= prices[0];dp[0][1] = 0;for (int i = 1; i < len; i++) {dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]); // 注意这里是和121. 买卖股票的最佳时机唯一不同的地方。dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);}return dp[len - 1][1];}
};

        当然同样为了降低空间复杂度,可以采用滚动数组的方法。

// 版本二
class Solution {
public:int maxProfit(vector<int>& prices) {int len = prices.size();vector<vector<int>> dp(2, vector<int>(2)); // 注意这里只开辟了一个2 * 2大小的二维数组dp[0][0] -= prices[0];dp[0][1] = 0;for (int i = 1; i < len; i++) {dp[i % 2][0] = max(dp[(i - 1) % 2][0], dp[(i - 1) % 2][1] - prices[i]);dp[i % 2][1] = max(dp[(i - 1) % 2][1], prices[i] + dp[(i - 1) % 2][0]);}return dp[(len - 1) % 2][1];}
};

LeetCode:  买卖股票的最佳时机III、IV

题目:123. 买卖股票的最佳时机 III、188. 买卖股票的最佳时机 IV

文字讲解: 123.买卖股票的最佳时机III、188. 买卖股票的最佳时机 IV

视频讲解:动态规划,股票至多买卖两次,怎么求? | LeetCode:123.买卖股票最佳时机III

基本思路

        买卖股票的最佳时机III这个题目要求最多出手两次,使所获得的利益最大化。而最佳时机IV则是引申到了n次。因此可以先通过最佳时机III进行分析。

动规五部曲分析如下:

  • 确定dp数组(dp table)以及下标的含义

        首先,如果至多出手三次,那么我们就存在5种状态,即dp[0][0]表示第一天第0次不持有股票(即初始状态)所获的最大金额,即dp[0][1]表示第一天第一次持有股票(即第一次买入时的状态)所获的最大金额,即dp[0][2]表示第一次不持有股票(即第一次卖出时的状态)所获的最大金额,即dp[0][3]表示第一天第二次持有股票所获的最大金额,即dp[0][4]表示第一天第二次不持有股票所获的最大金额。

  • 确定递推公式

        dp[i][0] = dp[i-1][0];

        dp[i][1] = max(dp[i-1][1],dp[i-1][0] - prices[i]);

        dp[i][2] = max(dp[i-1][2],dp[i-1][1] + prices[i]);

        dp[i][3] = max(dp[i-1][3],dp[i-1][2] - prices[i]);

        dp[i][4] = max(dp[i-1][4],dp[i-1][3] + prices[i]);

  • dp数组如何初始化

        数组初始化为0,并且dp[0][1] = -prices[0];以及dp[0][3] = -prices[0];

  • 确定遍历顺序

        从递归公式其实已经可以看出,一定是从前向后遍历,因为dp[i],依靠dp[i - 1]的数值。

  • 举例推导dp数组

        以输入[1,2,3,4,5]为例。

C++代码

// 版本一
class Solution {
public:int maxProfit(vector<int>& prices) {if (prices.size() == 0) return 0;vector<vector<int>> dp(prices.size(), vector<int>(5, 0));dp[0][1] = -prices[0];dp[0][3] = -prices[0];for (int i = 1; i < prices.size(); i++) {dp[i][0] = dp[i - 1][0];dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] + prices[i]);dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);}return dp[prices.size() - 1][4];}
};

        同样,可以使用滚动数组进行优化。

// 版本二
class Solution {
public:int maxProfit(vector<int>& prices) {if (prices.size() == 0) return 0;vector<int> dp(5, 0);dp[1] = -prices[0];dp[3] = -prices[0];for (int i = 1; i < prices.size(); i++) {dp[1] = max(dp[1], dp[0] - prices[i]);dp[2] = max(dp[2], dp[1] + prices[i]);dp[3] = max(dp[3], dp[2] - prices[i]);dp[4] = max(dp[4], dp[3] + prices[i]);}return dp[4];}
};
http://www.hkea.cn/news/25898/

相关文章:

  • 泰安网站建设公司排名石家庄最新消息
  • 域名只做邮箱没网站要备案吗常见的网络推广方式包括
  • 昆山建设局网站360搜索首页
  • 正常做网站多少钱无锡网站制作无锡做网站
  • php做网站csdn网站seo公司哪家好
  • 今日头条建站工具何鹏seo
  • wordpress 培训模板优化落实疫情防控新十条
  • 关于做外汇现货的网站太原整站优化排名外包
  • 星悦做任务网站是新网站百度收录
  • 十大营销网站seo关键词查询工具
  • 怎么查询网站所有关键词靠谱的广告联盟
  • 超酷的网站设计磁力搜索引擎
  • 网站建设写程序用什么软件成都疫情最新消息
  • 做网站需要什么资金2022今天刚刚发生地震了
  • 建设网站费用主要包括哪些google商店
  • 专注邯郸建设手机网站贴吧友情链接在哪
  • 网站备案拍照背景志鸿优化网官网
  • 网站百度知道怎么做推广网站搜索引擎优化的方法
  • 网站建设注意哪些问题sem和seo是什么职业岗位
  • 一_建设网站前的市场分析奶茶软文案例300字
  • 做网站智能工具江阴企业网站制作
  • 怎么看网站有没有做推广大数据营销系统多少钱
  • 广东工厂搜索seoseo平台优化服务
  • 网站开发平台 eclipseseo网站推广案例
  • 什么网站做调查能赚钱关键词优化报价推荐
  • 网站开发职业认知小结开发一个app平台大概需要多少钱?
  • 装修公司全包项目seo搜索引擎实训心得体会
  • 爱站网是干什么的长沙关键词排名首页
  • wordpress 教垜四川seo推广公司
  • 东莞市阳光网青岛seo服务