【LeetCode每日一题】——121.买卖股票的最佳时机

这篇博客讨论了如何运用贪心算法解决121.买卖股票的最佳时机的问题。文章通过一个简单的示例解释了如何在给定的股票价格数组中找到最大利润。题目要求在买入和卖出之间找到一个最佳的交易对,使得利润最大化。博主提供了Java和C语言的代码实现,这两种实现都使用了O(N)的时间复杂度,避免了双重循环导致的时间浪费。最后,博客给出了代码的运行结果,验证了算法的正确性。
摘要由CSDN通过智能技术生成

一【题目类别】

  • 数组

二【题目难度】

  • 简单

三【题目编号】

  • 121.买卖股票的最佳时机

四【题目描述】

  • 给定一个数组 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 < = p r i c e s . l e n g t h < = 1 0 5 1 <= prices.length <= 10^5 1<=prices.length<=105
  • 0 < = p r i c e s [ i ] < = 1 0 4 0 <= prices[i] <= 10^4 0<=prices[i]<=104

七【解题思路】

  • 这道题可以很容易的想到两层 f o r for for循环,但是这样有的用例会超时(时间复杂度为: O ( N 2 ) O(N^2) O(N2),其中 N N N为数组长度),原因是多了很多无谓的判断,所以我们要想怎么减少这些多余的判断,可以更快的找到最大利润
  • 所以我们很容易的想到了贪心算法,我们要将利润最大化,也就是说要买入的价钱最少,卖出的价钱最多,但是我们要注意要先买入,在卖出,这个可以通过示例看得更清楚
  • 基于这个思路,我们维护maxProfit初始化为0,也就是利润最小是0,minPrice初始化为数组的第一个值,向后搜索时,如果遇到比minPrice还小的值就赋给minPrice表示可以以更小的价钱买入,至于哪天卖出就向后搜索即可,做减法就是利润,如果利润大于我们维护的maxProfit,就更新maxProfit
  • 循环结束后返回maxProfit即可

八【时间频度】

  • 时间复杂度: O ( N ) O(N) O(N),其中 N N N为数组长度
  • 空间复杂度: 1 1 1

九【代码实现】

  1. Java语言版
package Array;

public class p121_TheBestTimeToBuyAndSellStocks {

    public static void main(String[] args) {
        int[] prices = {7, 1, 5, 3, 6, 4};
        int res = maxProfit(prices);
        System.out.println(res);
    }

    public static int maxProfit(int[] prices) {
        int maxProfit = 0;
        int minPrice = prices[0];
        for (int i = 0; i < prices.length; i++) {
            if (prices[i] < minPrice) {
                minPrice = prices[i];
            }
            if ((prices[i] - minPrice) > maxProfit) {
                maxProfit = prices[i] - minPrice;
            }
        }
        return maxProfit;
    }

}
  1. C语言版
#include<stdio.h>

int maxProfit(int* prices, int pricesSize)
{
	int maxProfit = 0;
	int minPrice = prices[0];
	for (int i = 0; i < pricesSize; i++)
	{
		if (prices[i] < minPrice)
		{
			minPrice = prices[i];
		}
		if ((prices[i] - minPrice) > maxProfit)
		{
			maxProfit = prices[i] - minPrice;
		}
	}
	return maxProfit;
}

/*主函数省略*/

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. C语言版
    在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IronmanJay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值