算法29:买卖股票的最佳时机

一、需求

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

示例 3:

输入:prices = [2,4,1]
输出:2

示例 4:

输入:prices = [2,1,2,1,0,1,2]
输出:2

提示:

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

二、思路分析图

算法29:买卖股票的最佳时机_第1张图片
算法29:买卖股票的最佳时机_第2张图片
算法29:买卖股票的最佳时机_第3张图片

三、代码

(一)数据初始化/调用函数

/**
 * 入口
 *      121、买卖股票的最佳时机
 * 输入:
 *      [7,1,5,3,6,4]
 * 输出:
 *      5
 * 解释:
 *      1.while
 *      2.for
 */
@Test
public void suanfa29()
{
    // 股票价格
    int[] prices = {7,1,5,3,6,4};

    // 打印
    int a = maxProfitWhile(prices);
    int b = maxProfitFor(prices);
    System.out.println("while = " + a);
    System.out.println("for = " + b);
}

(二)while循环方案

/**
 * while循环方案
 *
 * @param prices 股票价格
 * @return
 */
public int maxProfitWhile(int[] prices) {
    // 最大值
    int max  = 0;
    // 总数
    int sum = 0;
    // 索引
    int index = 1;
    // 最小值
    int min = prices[0];

    // 循环判断(数组长度 > 索引)
    while(prices.length > index)
    {
        // 如果下一个数组值 > 最小值
        if (prices[index] > min)
        {
            // 总数 = 就用下一个数组值 - 最小值
            sum = prices[index] - min;
            // 判断是否大于最大值,大于就赋值到最大值中
            max = sum > max ? sum : max;
        }
        else
        {
            // 否则下一个数组就是最小值,赋值给最小值
            min = prices[index];
        }
        // 索引++
        index++;
    }
    // 返回最大值
    return max;
}

(三)for循环方案

/**
 * for循环方案
 *
 * @param prices 股票价格
 * @return
 */
public int maxProfitFor(int[] prices) {
    int max  = 0;
    int min = prices[0];
    for(int i = 1; i < prices.length; i++)
    {
        if (prices[i] < min)
        {
            min = prices[i];
        }
        else if (prices[i] - min > max)
        {
            max = prices[i] - min;
        }
    }
    return max;
}

(四)结果图

算法29:买卖股票的最佳时机_第4张图片

作者:王子威

四、总结

  • 学习了买卖股票的最佳时机
  • 一次遍历:时间复杂度:O(n) 空间复杂度O(1)
  • 全部计算一遍,保留最大值即可
  • if-else-if 比 if-else消耗内存,如果非必要还是用if-else
  • 算法兴趣+1 总:29
  • 加强了对算法的分析能力

你可能感兴趣的:(LeetCode,#,算法,算法,数据结构,c++)