首页 > 其他分享 >每日小题--买股票的最佳时机

每日小题--买股票的最佳时机

时间:2024-11-14 21:15:46浏览次数:3  
标签:遍历 -- 买入 maxProfit int 最佳时机 小题 prices 卖出

目录

题目 

 分析

解题思路

完整代码


题目 

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

示例 1:

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

示例 2:

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

提示:

  • 1 <= prices.length <= 105
  • 0 <= prices[i] <= 104

 分析

我们想要找到一个最低的买入点,并且需要保证在这个最低买入点后出价最高的一天卖出,简而言之,就是找到一个比起始小,并且结尾在一个有最大差距的位置;

毋庸置疑,一定需要数组遍历结束后才能确定这么一个买入点和卖出点,所以此时想要提升算法的话就要找到一个只需要遍历一遍就能出结果的方法,即将时间复杂度控制在O(n);

摒弃【原始方法:循环遍历所有可能的情况再去判断是否能盈利为正,并且在这个盈利为正的区间内挑出来最大的利润---时间复杂度O(n^2)】的原始方法。

解题思路

遍历数组的过程中去找数组中是否存在一个低价点,并且在低价点的基础上去判断有无上升空间;即杜绝了{4,3,2,1}的情况出现,买入后无法卖出。

这里先设置一个无限大的minprice;而且默认初始利润maxprofit=0;

int maxProfit=0; //将初始设为0

int minPrice=Integer.MAX_VALUE;//初始化无限大

接下来遍历,只要找到更小的price可买入后就更新minprice 

【如下指针找到了一个价格的上升趋势,此时就要在既定的minprice基础上更新maxprofit,直至找到一个最大的卖出点】 

【如同上述三张图所见,只要prices[i]<minPrice是符合的,就不会走进比较利润的else if中,这样也杜绝了出现{4,3,2,1},这种的情况,即maxProfit就不会被赋值了,产出0】

【只有后一个数据比minPrice大的时候,才能进入else if条件,进行maxProfit比较】

完整代码

class Solution {
    public int maxProfit(int[] prices) {
       int maxProfit=0; //将初始设为0
       int minPrice=Integer.MAX_VALUE;//初始化无限大
       for(int i=0;i<prices.length;i++){
            if(prices[i]<minPrice){
                minPrice=prices[i];
            }else if(prices[i]-minPrice>maxProfit){
                maxProfit=prices[i]-minPrice;
            }
       }
        return maxProfit;
    }
}

标签:遍历,--,买入,maxProfit,int,最佳时机,小题,prices,卖出
From: https://blog.csdn.net/m0_74977981/article/details/143780752

相关文章

  • PTA 穷举问题-搬砖
    作者 杨起帆单位 浙大城市学院某工地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬1块。如果想用n人正好搬n块砖,问有多少种搬法?输入格式:输入在一行中给出一个正整数n。输出格式:输出在每一行显示一种方案,按照"men=cnt_m,women=cnt_w,child=cnt_c"的......
  • 深入浅出学算法044-最大整数
    题目描述设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。      例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213      又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613输入输入分2行第一行是n第2行是n个整数输出连接成的多位数......
  • 深入浅出学算法031-平面分割
    题目描述同一平面内有n(n≤500)条直线,已知其中p(p≥2)条直线相交于同一点,则这n条直线最多能将平面分割成多少个不同的区域?输入两个整数n(n≤500)和p(如果n>=2则2≤p≤n)。输出一个正整数,代表最多分割成的区域数目。样例输入125样例输出73代码走起代码#include<bits/std......
  • 关于嵌入式硬件设计方面的必备知识!
     成长路上不孤单......
  • 带你一起全面了解关于Python网络爬虫的相关知识点!
     成长路上不孤单......
  • 2024.11.14 2105版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • 洛必达法则的证明与可用条件
    洛必达法则(L'Hôpital'sRule)是一个用于处理极限中不定型的有效工具,尤其是在极限形式为$\frac{0}{0}$或$\frac{\infty}{\infty}$时,能有效地通过导数简化极限计算。它通常用于计算一些看似复杂的极限问题,尤其当函数的形式比较难直接求解时。洛必达法则定义洛必达法则的基......
  • 鸿蒙NEXT开发案例:年龄计算
     ​【引言】本案例的目标是开发一款年龄计算器应用,该应用能够根据用户输入的出生日期,计算出用户的实际年龄、虚岁、星座、生肖等信息。同时,应用还将提供距离下次公历和农历生日的天数及星期等信息。为了实现这些功能,我们将使用ArkTS和ArkUI作为开发语言,并借助@nutpi/calendar......
  • NOIP2024 前集训:MX 炼石计划 NOIP 模拟赛 20
    前言今天不知道为啥去打MX了,bug不少啊,包括但不限于赛时能通过自己主页看自己题过没过,赛时可以进入“补题”的比赛交从而直接成IOI赛制,文件还有点问题?0+100+12+0,T1读假题:\(\ge×,>√\),喜提爆零,但是本来就不会正解,我去我表都打出来了不知道二分??!?!!?不打T4是错误的,乱搞能得的分......
  • Python并行编程1并行编程简介(上)高频面试题:GIL进程线程协程
    1并行编程简介首先,我们将讨论允许在新计算机上并行执行的硬件组件,如CPU和内核,然后讨论操作系统中真正推动并行的实体:进程和线程。随后,将详细说明并行编程模型,介绍并发性、同步性和异步性等基本概念。介绍完这些一般概念后,我们将讨论全局解释器锁(GIL)及其带来的问题,从而了解Py......