博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
122. 买卖股票的最佳时机 II
阅读量:4553 次
发布时间:2019-06-08

本文共 1655 字,大约阅读时间需要 5 分钟。

暴力

  本题可以多次买卖股票,如果只允许一次买卖股票,整个暴力就是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[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[i+1]){ i++; } low = prices[i]; while (i

 

转载于:https://www.cnblogs.com/AshOfTime/p/10812853.html

你可能感兴趣的文章
UVa-1368-DNA序列
查看>>
ConfigParser模块
查看>>
如何开发优质的 Flutter App:Flutter App 软件测试指南
查看>>
决胜Flutter 第一章 熟悉战场
查看>>
如何开发优质的 Flutter App:Flutter App 软件调试指南
查看>>
决胜经典算法之冒泡排序
查看>>
决胜经典算法之选择排序
查看>>
11、求二进制中1的个数
查看>>
【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--请求处理结果适配篇(7/8)...
查看>>
CodeForces 731A Night at the Museum
查看>>
MySQL 删除数据库
查看>>
JavaScript 字符串(String) 对象
查看>>
How to use VisualSVN Server and TortoiseSVN to host your codes and control your codes' version
查看>>
微信小程序picker组件 - 省市二级联动
查看>>
Dynamics CRM 给视图配置安全角色
查看>>
Eclipse修改已存在的SVN地址
查看>>
C++ ACM基础
查看>>
(转)使用 python Matplotlib 库绘图
查看>>
进程/线程切换原则
查看>>
正则表达式语法
查看>>