JZ63 买卖股票的最好时机(一)
描述
假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益
1.你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖出一次,总共只能买入和卖出一次,且买入必须在卖出的前面的某一天
2.如果不能获取到任何利润,请返回0
3.假设买入卖出均无手续费
炒股就四个字,追涨杀跌,哦,错了,高抛低吸。
解法一:暴力法
使用双层for循环遍历,将每一个元素与后面的每一个元素相比较。
public int maxProfit (int[] prices) {int max=0;
for(int i=0;i<prices.length-1;i++){for(int j=i+1;j<prices.length;j++){int temp = prices[j]-prices[i];max=temp>max?temp:max;}
}
return max;
}
复杂度分析:
时间复杂度:O(N[^2]),遍历数组两层
空间复杂度:O(1),不涉及额外存储空间
解法二:动态规划
每一天都有持有和未持有两种状态,前一天的状态会影响到后一天的状态,可以考虑使用动态规划。
创建一个两列的二维数组,第一列存储未持有,第二列存储持有。
未持有:有两种情况,今天卖出和以前就卖出了,求二者的较大值。今天卖出等于当前价格减去前一天持有价格,以前卖出等于前一天未持有的价格。
持有:有两种情况,今天才买入和以前买入持有到今天,求二者的较小值。今天买入等于当前价格,以前买入等于前一天持有的价格
public int maxProfit (int[] prices) {int n =prices.length;int[][] dp = new int[n][2];dp[0][0]=0;dp[0][1]=prices[0];for(int i=1;i<n;i++){dp[i][0]=Math.max(dp[i-1][0],prices[i]-(dp[i-1][1]));dp[i][1]=Math.min(prices[i],dp[i-1][1]);}return dp[n-1][0];
}
因为后一天只受前一天的状态影响,所以可以优化去掉二维数组,改用两个中间变量。
动态规划优化:
public int maxProfit (int[] prices) {int max=0;int temp =0;int min=prices[0];for(int i=1;i<prices.length;i++){max=Math.max(prices[i]-min,max);min=Math.min(prices[i],min);}return max;
}
复杂度分析:
时间复杂度:O(N),遍历数组一次
空间复杂度:O(1),不涉及额外存储空间
总结:
涉及数据结构:数组
涉及算法:动态规划
JZ63 买卖股票的最好时机(一)相关推荐
- 牛客题霸 [买卖股票的最好时机] C++题解/答案
买卖股票的最好时机 题解: 设两个变量,一个为minn,一个为maxx 当遇到比当前minn还小的价钱时,就更新minn 当与minn大时,就计算如果这个价卖出,赚多少钱,maxx不断更新取最大值 这 ...
- 30、买卖股票的最好时机
买卖股票的最好时机(一) 描述 假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益 1.你可以买入一次股票和卖出一次股 ...
- DP31 买卖股票的最好时机(二)、(三)、(四)
买卖股票的最好时机(二) 描述 假设你有一个数组prices,长度为n,其中prices[i]是某只股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益 1. 你可以多次买卖该只股票, ...
- dp(八)买卖股票的最好时机 (一,二、三)
目录 买卖股票的最好时机(一)_牛客题霸_牛客网 买卖股票的最好时机(二)_牛客题霸_牛客网 买卖股票的最好时机(三)_牛客题霸_牛客网 假设你有一个数组prices,长度为n,其中prices[i] ...
- 买卖股票的最好时机(一、二)
目录 买卖股票的最好时机(一) 动态规划解决 贪心思想解决 买卖股票的最好时机(二) 贪心思想解决 动态规划解决 买卖股票是经典的动态规划问题,在动态规划的学习与练习中,最令我煎熬的就是状态方程递推, ...
- 剑指offer(C++)-JZ63:买卖股票的最好时机(一)(算法-动态规划)
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格, ...
- 动态规划——买卖股票的最好时机(Leetcode 121)
题目选自Leetcode 121. 买卖股票的最佳时机 提示:股票系列问题有共通性,但难度较大,初次接触此类问题的话很难看懂下述思路,建议直接看labuladong大神的题解 题目描述: 解题思路: ...
- 【力扣刷题】121.买卖股票的最好时机(python)
题目简述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格. 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票.设计 ...
- NC7 买卖股票的最好时机(一)
假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益 1.你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖出一次 ...
最新文章
- Kotlin 中infix,inline,noinline,crossinline ,refied 等的理解
- boost::fusion::all用法的测试程序
- [Python学习] 专题五.列表基础知识 二维list排序、获取下标和处理txt文本实例
- 存钱吃利息存邮政储蓄好还是农业银行好?
- 正式发布!鸿蒙,来了!
- C语言 如何计算结构体的大小
- C语言 底层IO lseek
- KafKa基本入门教程
- dubbo注册中心介绍
- 探讨下Tag标签的数据库设计(千万级数据量) 转
- Android Framework - 学习启动篇
- 迷宫算法总结(最短路径)
- 好听又好看!歌曲视频制作,手把手教你制作音乐视频
- 室内外无缝定位导航,GPS系统可以实现吗?
- PD协议诱骗取电XSP01支持Type-C 5V9V12V15V20V原理图
- clickhouse优缺点总结
- Windows下的SSL 应用
- 关于小米 角标不显示问题(只有第一次安装应用才会显示角标的问题解决方案)
- 计算机组成原理第七章笔记---输入输出
- (附源码)springboot中北创新创业官网 毕业设计 271443