首页 > 编程语言 >算法题解——买卖股票的最佳时机

算法题解——买卖股票的最佳时机

时间:2023-10-14 23:34:00浏览次数:45  
标签:cost profit 题解 复杂度 int 算法 最佳时机 prices price

解题思路

先考虑最简单的「暴力遍历」,即枚举出所有情况,并从中选择最大利润。设数组 prices 的长度为n,由于只能先买入后卖出,因此第 1 天买可在未来n−1天卖出,第 2 天买可在未来n - 2天卖出……以此类推,共有

\[(n - 1) + (n - 2) + \cdots + 0 = \frac{n (n - 1)}{2} \]

种情况,时间复杂度O(N^2)。考虑到题目给定的长度范围 1≤prices.length≤10^5 ,需要思考更优解法。

然而,暴力法会产生许多冗余计算。例如,若第 1 天价格低于第 2 天价格,即第 1 天成本更低,那么我们一定不会选择在第 2 天买入。进一步的,若在前i天选择买入,若想达到最高利润,则一定选择价格最低的交易日买入。考虑根据此贪心思想,遍历价格列表 prices 并执行两步:

由于初始值i=0,为了序号对应,本文设从第 0 天开始;

  1. 更新前i天的最低价格,即最低买入成本 cost
  2. 更新前i天的最高利润 profit ,即选择「i-1天最高利润 profit 」和「i天卖出的最高利润 price - cost 」中的最大值 ;

figures.gif


代码

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 使用 O(1)空间。


参考资料:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/solutions/1692872/by-jyd-cu90/?envType=study-plan-v2&envId=top-interview-150

标签:cost,profit,题解,复杂度,int,算法,最佳时机,prices,price
From: https://www.cnblogs.com/Enid/p/17764959.html

相关文章

  • Atcoder Beginner Contest 324 F Beautiful Path 题解-分数规划
    为了更好的阅读体验,请点击这里分数规划小技巧:尽可能将式子写成存在某种取值,使得不等式成立的形式。不然可能需要绕几个弯才能想出来。题目链接题目大意:给出一个DAG,每条边有一个\(b_i,c_i\),保证从编号小的边向编号大的边连边,且\(1\)到\(n\)必有路径,求\(1\)到\(n\)......
  • CF1204D2 Kirk and a Binary String (hard version) 题解
    CF1204D2KirkandaBinaryString(hardversion)题解分析先来分析\(01\)串的最长不下降子序列。全是\(0\)显然是不下降的,如果中间出现一个\(1\),为了维护不下降的性质,后面就只能全是\(1\)。一句话概括一下,\(0\)后面能跟\(0,1\),\(1\)后面只能跟\(1\)。现在来分析这......
  • 题解 [ABC258G] Triangle
    题目链接\(\rmO(n^3)\)枚举\(i,j,k\)的算法是显然的。考虑优化掉一个\(n\),如果枚举\(i,j\),那么显然需要找出有多少个\(k\)同时满足\(a_{i,k}=a_{j,k}=1\),我们可以将\(a_i\)和\(a_j\)看作两个二进制数,那么同时等于\(1\)的位置就是并起来等于\(1\)的位置,\(bitset......
  • 观光奶牛 详细题解
    #T3#SPFA判断正/负环#二分查找为啥现在突然发出来:翻自个笔记发现这篇写的挺好hhh361.观光奶牛-AcWing题库给定一张\(L\)个点、\(P\)条边的有向图,每个点都有一个权值\(f[i]\),每条边都有一个权值\(t[i]\)。求图中的一个环,使“环上各点的权值之和”除以“环上各边的......
  • 智慧矿山&矿山安全生产:矿山AI算法皮带坐人检测-助力安全生产,保护工人生命
    矿山AI算法皮带坐人检测技术是基于人工智能技术的一项创新应用。它通过在皮带输送设备上安装智能摄像头,利用AI算法进行实时监测和分析,确保皮带上没有工人坐卧,从而避免发生意外伤害。该技术不仅能够准确检测到工人的坐卧姿势,还可以检测到工人的距离和身体姿态,为工作人员提供及时的安......
  • [题解]AT_abc153_f [ABC153F] Silver Fox vs Monster
    模拟赛最后\(15\)分钟想到的做法。思路首先有一个显然的贪心策略:我们放炸弹的地方要尽可能的使这个炸弹能影响到更多的怪上。那么我们可以将对于一个怪\(i\)能够影响到它的区间表示出来\([\max(1,l_i-d),a_i+r]\)。然后将这些区间排个序,可以粗略画出这样的图:根据上......
  • 算法0506 对数器 二分搜索
    对数器非常重要的自我验证代码正确性的方法在面试时或机试时写算法题,没有测试用例或者测试用例太少,导致巨大的数据量无法进行测试时。需要自己写测试用例数据时可以使用对数器。......
  • 算法讲解0304
    1、打印二进制voidprint(intnum){ for(inti=31;i>=0;i--) if((num&(1<<i))==0) cin>>0; else cin>>1;}2、选择排序voidselectionSort(intarry[]){ intn=sizeof(arry)/sizeof(*a); if(n<2)return; for(inti=0......
  • C++基本算法大致总结
    排序算法:快速排序(QuickSort):使用std::sort或自定义实现。归并排序(MergeSort):自定义实现或使用std::stable_sort。堆排序(HeapSort):自定义实现或使用std::make_heap和std::sort_heap。搜索算法:二分查找(BinarySearch):使用std::binary_search或自定义实现。线性......
  • P1084疫情控制 题解
    P1084疫情控制前言:这题思路不难,实现稍微有点难。总体来说,不算特别难的那种紫题,建议评蓝。题目描述给定一些点,用这些点来切断根节点到所有叶子节点的路径,可以移动这些点,不同的点可以同时移动,求时间最少。思考过程不同的点可以同时移动:看到这里,我们可以转化一下题目:给定......