**Leetcode 123 Best Time to Buy and Sell Stock III

2024-05-28 04:08

本文主要是介绍**Leetcode 123 Best Time to Buy and Sell Stock III,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/description/

O(n^2)的做法就不解释了,枚举划分的位置即可。但是关键点在最多两次,所以可以考虑前缀后缀和。

先说O(n^2)的

class Solution {
public:int maxProfitForOne(vector<int>& prices, int l, int r) {  if (r - l == 0) return 0;  int ret = 0, cur_min = prices[l];  for (int i = l+1; i < r; i++) {  ret = max(ret, prices[i] - cur_min);  if (prices[i] < cur_min) {  cur_min = min(prices[i], cur_min);  }  }  return ret;  }  bool needJudge(vector<int>& prices, int idx) {idx -= 1;if (idx == 0 || idx == prices.size()-1) return true;if (prices[idx] >= prices[idx - 1] && prices[idx] > prices[idx + 1])return true;elsereturn false;}int maxProfit(vector<int>& prices) {if (prices.size() <= 1) return 0;int ret = 0, left = 0, right = 0;for (int sp = 1; sp < prices.size() + 1; sp ++) {if (!needJudge(prices, sp)) continue;left = maxProfitForOne( prices, 0, sp );right = maxProfitForOne( prices, sp, prices.size() );ret = max( ret, left + right );}return ret;}
};


O(n)的 维护前缀后缀,注意边界。。。当时我想到的一个O(4*n)的分情况比较多

class Solution {
public:int maxProfit(vector<int>& prices) {if (prices.size() <= 1) return 0;int prefix[prices.size()+1], suffix[prices.size()+1];prefix[0] = 0; suffix[prices.size()] = 0;int cur_min = prices[0], cur_ans = 0;for (int i = 1; i < prices.size(); i++) {cur_ans = max(cur_ans, prices[i] - cur_min);prefix[i] = cur_ans;if (prices[i] < cur_min) cur_min = prices[i];}int cur_max = prices[prices.size()-1];cur_ans = 0; for (int i = prices.size() - 1; i >= 0; i--) {cur_ans = max(cur_ans, cur_max - prices[i]);suffix[i] = cur_ans;if (prices[i] > cur_max) cur_max = prices[i];}int ret = 0;for (int i = 0; i < prices.size(); i++) {ret = max(ret, prefix[i] + suffix[i+1]);}return ret;}
};


然后发现还有更好的解:空间O(1)时间O(n)

https://discuss.leetcode.com/topic/5934/is-it-best-solution-with-o-n-o-1

http://blog.csdn.net/u012501459/article/details/46514309



这篇关于**Leetcode 123 Best Time to Buy and Sell Stock III的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1009501

相关文章

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return