首页 > 其他分享 >LeetCode面试150——121买卖股票的最佳时机

LeetCode面试150——121买卖股票的最佳时机

时间:2024-07-30 13:26:42浏览次数:16  
标签:150 profit price 121 int 复杂度 prices minprice LeetCode

题目难度:简单

默认优化目标:最小化平均时间复杂度。

Python默认为Python3。

目录

1 题目描述

2 题目解析

3 算法原理及程序实现

3.1 暴力求解

3.2 动态规划

参考文献


1 题目描述

给定一个数组 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

2 题目解析

输入是一个数组prices,输出是最大利润,即price中两个元素之间最大的差值。约束条件是要后一天的价格减去前一天的价格。

3 算法原理及程序实现

3.1 暴力求解

我们使用双重循环,外循环用于遍历元prices中元素,内循环用于比较当前元素和其后面所有元素的差值。在所有差值中找到最大的,即题目要求的输出。

平均时间复杂度为O(n^2),平均空间复杂度为O(1)。

C++代码实现

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

Python代码实现

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        n=len(prices)
        profit=0
​
        for i in range(n):
            for j in range(i+1,n):
                profit=max(profit,prices[j]-prices[i])
​
        return profit

3.2 动态规划

举个例子,现在prices=[8,3,5,7,4,6,4],折线图如下。

买卖股票,无非是低点买进,高点卖出。最理想呢,是最低点买进,最高点卖出。问题就拆分成,寻找价格的最低点,然后用最低点后面的价格去减,取最大的差值。

这个过程是动态的,且只需要一次循环就能完成。还是以prices=[8,3,5,7,4,6,4]的例子说明。我们记最小值为minprice,记利润为profit,记当前元素为price。首先,给minprice赋个极大值,初始化profit=0。第一次,price=8,我们让price-minprice,然后和profit比大小,取最大值。明显profit=0。然后,让priceminprice比大小,取最小的那个,minprice=8。第二次,price=3profit=0,minprice=3。第三次,price=5profit=2minprice=3。第四次,price=7profit=4minprice=3。第五次,price=4profit=4minprice=3。第六次,price=6profit=4minprice=3。第七次,price=4profit=4minprice=3

价格最低点是在动态更新的,利润也在动态更新。由于我们只遍历一遍全部元素,当找到最小值时,和它相减的价格必然出现在这个最小值之后。满足后一天的价格减去前一天的价格这个约束。

平均时间复杂度为O(n),平均空间复杂度为O(1)。

C++代码实现

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int profit=0;
        int minprice=1e9;
​
        for(int price: prices){
            profit=max(profit,price-minprice);
            minprice=min(minprice,price);
        }
​
        return profit;
    }
};

Python代码实现

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        profit=0
        minprice=int(1e9)
​
        for price in prices:
            profit=max(profit,price-minprice)
            minprice=min(minprice,price)
​
        return profit

参考文献

力扣面试经典150题

力扣官方题解

标签:150,profit,price,121,int,复杂度,prices,minprice,LeetCode
From: https://blog.csdn.net/Junmo12345/article/details/140780552

相关文章

  • Web 安全:Memcached 未授权访问漏洞.(11211端口)
    Web安全:Memcached未授权访问漏洞Memcached是一套常用的key-value缓存系统,由于它本身没有权限控制模块,所以对公网开放的Memcache服务很容易被攻击者扫描发现。然而Memcached的默认配置,11211端口 不需要密码即可访问,可以直接连接到Memcached服务的11211端口获取......
  • 代码随想录——完全平方数(Leetcode 279)
    题目链接动态规划动态规划思路:状态定义:定义一个一维数组dp,其中dp[i]表示组成整数i所需的最少完全平方数的数量。状态初始化:将dp数组中的所有元素初始化为Integer.MAX_VALUE,表示初始状态下组成每个整数的完全平方数数量是无限大(即不可能)。但dp[0]需要初始化为0,因为组成......
  • 《LeetCode热题100》---<双指针篇四道>
    本篇博客讲解LeetCode热题100道双指针篇中的第一道:移动零(简单)第二道:盛最多水的容器(中等)第一道:移动零(简单)classSolution{publicvoidmoveZeroes(int[]nums){for(intcur=0,dest=-1;cur<nums.length;cur++){//采用双指针......
  • LeetCode - #107 二叉树的层序遍历 II
    文章目录前言1.描述2.示例3.答案关于我们前言我们社区陆续会将顾毅(Netflix增长黑客,《iOS面试之道》作者,ACE职业健身教练。)的Swift算法题题解整理为文字版以方便大家学习与阅读。LeetCode算法到目前我们已经更新到105期,我们会保持更新时间和进度(周一、......
  • LeetCode之vector
    目录前言1.杨辉三角2.删除有序数组的重复项3.只出现一次的数字Ⅲ只出现一次的数字Ⅱ数组中出现次数超过一半的数字补充讲解sort()前言本篇是对vector的一个巩固练习,题目分别在leetcode和牛客网博客主页:酷酷学!!!感谢关注~正文开始1.杨辉三角题目思路......
  • leetcode-9
    题目:给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是推导:自己硬写的。代码:1classSolution{2public:3boolisPalindrome(intx){4......
  • LeetCode682
    classSolution{  publicintcalPoints(String[]operations){    int[]a=newint[1000];    intj=0;    intsum=0;    for(inti=0;i<operations.length;i++){        if("+".equals(operations[i])){ ......
  • LeetCode LCR 124.推理二叉树(哈希表 + 建树)
    某二叉树的先序遍历结果记录于整数数组 preorder,它的中序遍历结果记录于整数数组 inorder。请根据 preorder 和 inorder 的提示构造出这棵二叉树并返回其根节点。注意:preorder 和 inorder 中均不含重复数字。示例1:输入:preorder=[3,9,20,15,7],inorder=......
  • leetcode-8,真恶心
    题目:请你来实现一个 myAtoi(strings) 函数,使其能将字符串转换成一个32位有符号整数。推导:代码:1classAutomaton{2public:3intsign=1;//初始化默认符号4longlongans=0;//初始化整数5unordered_map<string,vector<string>>table......
  • LeetCode 408场周赛,Q3. 统计 1 显著的字符串的数量;问题分析
    https://leetcode.cn/contest/weekly-contest-408/problems/count-the-number-of-substrings-with-dominant-ones/description/、、这题难度是middle,但是确实有点强思维的味道,赛时思考了许久,没想到好方向,最后想了个线段树的解法。。当然最后超时了861/884,二十多个用例过不去;......