122. 买卖股票的最佳时机 II

https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/solution/

暴力

  本题可以多次买卖股票,如果只允许一次买卖股票,整个暴力就是n2的算法,如果可以无限制买卖股票直接用普通的写法不是很好写,可以用递归来解决。先考虑只允许一次买卖的暴力解法,双层循环,外层循环i代表买入股票的时机,内层j循环从i+1开始,代表买入股票后的股票价格,如果发现prices[j]>prices[i]就尝试卖掉并和全局max比较,如果大于全局max就更改。但本题可以无限买卖股票,所以在一次买卖后还可以接着买卖,这样问题就变化为了在i买入j卖出后,在j到prices.length的范围内继续买卖,原问题转化为了子问题,这很递归。

  每次i买入股票j卖出股票后,对j+1以后的股票递归调用,int s代表股票开始的位置。

  这里用了两个临时变量来存储可能的最大值。max代表全局最大值,放在最外层的循环,代表从索引s开始买卖股票能够获取的最大的利润。maxProfit放在内层循环,当i等于s时,代表从s买股票能够获得的最大利润,每次算出maxProfit用于和max比较并更新max。

public class maxProfit_122 {
    public int maxProfit(int[] prices) {
        return cal(prices,0);
    }

    public int cal(int[] prices,int s){
        if (s>=prices.length){
            return 0;
        }

        int max = 0;
        for (int i=s;i<prices.length;i++){
            int maxProfit = 0;
            for (int j=i+1;j<prices.length;j++){
                if (prices[j]>prices[i]){
                    int tempProfit = cal(prices, j + 1) + prices[j] - prices[i];
                    maxProfit = tempProfit>maxProfit?tempProfit:maxProfit;
                }
            }
            max = maxProfit>max?maxProfit:max;

        }
        return max;
    }

波峰波谷

  因为买卖次数是无限的,所以把问题转化为求整个股票价格序列中所有波峰和波谷之差之和。遍历整个数组,找到波谷,找到波峰,相减。

  先不考虑开始,假设现在处在循环之中。比较i和i+1,如果i大于i+1说明这是递减区间,一直往下走,直到i不再大于i+1说明递减区间结束,i不再大于i+1说明i<i+1,此时i的值为波谷,这个很简单,导数异号说明来到了极值。用同样的方法找到最大值,然后相减即为一次买卖的利润。

  其次关注初始条件的设置,low high都设置为Index等于0的数。如果数组的第一个区间是递增的,那么low就是0。

class Solution {
    public int maxProfit(int[] prices) {
        if(prices.length == 0){
            return 0;
        }
        int i = 0;
        int low = prices[0];
        int high = prices[0];
        int result=0;

        while (i<prices.length-1){
            while (i<prices.length-1 && prices[i]>=prices[i+1]){
                i++;
            }
            low = prices[i];
            while (i<prices.length-1 && prices[i]<=prices[i+1]){
                i++;
            }
            high = prices[i];
            result+=high-low;
        }
        return result;
    }
}

原文地址:https://www.cnblogs.com/AshOfTime/p/10812853.html

时间: 2024-10-29 21:19:45

122. 买卖股票的最佳时机 II的相关文章

【Leetcode】【简单】【122. 买卖股票的最佳时机 II】【JavaScript】

题目描述 122. 买卖股票的最佳时机 II 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票). 示例 1: 输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 .随后,在第 4 天(股票价格

Leetcode 122.买卖股票的最佳时机II

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票). 示例 1: 输入: [7,1,5,3,6,4] 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 . 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票

LeetCode(122. 买卖股票的最佳时机 II)

问题描述 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票). 示例 1: 输入: [7,1,5,3,6,4] 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 . 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5

2. 解题报告~买卖股票的最佳时机 II

原题地址:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/1/array/22/ 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票). 示例 1: 输入: [7,1,5,3,6,4] 输出: 7 解释: 在第 2 天(股票

买卖股票的最佳时机 II

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票). 示例 1: 输入: [7,1,5,3,6,4] 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 .   随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(

[LeetCode]数组——买卖股票的最佳时机 II

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票). C++ class Solution { public: int maxProfit(vector<int>& prices) { int sum = 0; for (size_t i = 1; i < prices.size(); i++) { if (

Leetcode 122 买卖股票的最佳时机

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票). 示例 1: 输入: [7,1,5,3,6,4] 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 .   随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(

买卖股票的最佳时机II

package main import "fmt" func main() { /* 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票). 示例 1: 输入: [7,1,5,3,6,4] 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利

LeetCode 腾讯精选50题-- 买卖股票的最佳时机 II

贪心算法: 具体的解题思路如下: II 的解题思路可以分为两部分, 1. 找到数组中差值较大的两个元素,计算差值. 2. 再步骤一最大的元素的之后,继续遍历,寻找差值最大的两个元素 可以得出的是,遍历指针是一直向着数组的尾部移动的,由于要取得局部的最大差值,这一局部子数组中的元素一定是递增的,所以先找到递增结束的位置,那就是递增位置的起点,然后遍历至此轮递增结束时的位置,这样就得到了一个局部的最优解. 此思路由于指针只遍历一次,所以时间复杂度为O(N). 以下是代码: class Solutio