描述
假设你有一个数组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 买卖股票的最好时机(一)相关推荐

  1. 牛客题霸 [买卖股票的最好时机] C++题解/答案

    买卖股票的最好时机 题解: 设两个变量,一个为minn,一个为maxx 当遇到比当前minn还小的价钱时,就更新minn 当与minn大时,就计算如果这个价卖出,赚多少钱,maxx不断更新取最大值 这 ...

  2. 30、买卖股票的最好时机

    买卖股票的最好时机(一) 描述 假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益 1.你可以买入一次股票和卖出一次股 ...

  3. DP31 买卖股票的最好时机(二)、(三)、(四)

    买卖股票的最好时机(二) 描述 假设你有一个数组prices,长度为n,其中prices[i]是某只股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益 1. 你可以多次买卖该只股票, ...

  4. dp(八)买卖股票的最好时机 (一,二、三)

    目录 买卖股票的最好时机(一)_牛客题霸_牛客网 买卖股票的最好时机(二)_牛客题霸_牛客网 买卖股票的最好时机(三)_牛客题霸_牛客网 假设你有一个数组prices,长度为n,其中prices[i] ...

  5. 买卖股票的最好时机(一、二)

    目录 买卖股票的最好时机(一) 动态规划解决 贪心思想解决 买卖股票的最好时机(二) 贪心思想解决 动态规划解决 买卖股票是经典的动态规划问题,在动态规划的学习与练习中,最令我煎熬的就是状态方程递推, ...

  6. 剑指offer(C++)-JZ63:买卖股票的最好时机(一)(算法-动态规划)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格, ...

  7. 动态规划——买卖股票的最好时机(Leetcode 121)

    题目选自Leetcode 121. 买卖股票的最佳时机 提示:股票系列问题有共通性,但难度较大,初次接触此类问题的话很难看懂下述思路,建议直接看labuladong大神的题解 题目描述: 解题思路: ...

  8. 【力扣刷题】121.买卖股票的最好时机(python)

    题目简述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格. 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票.设计 ...

  9. NC7 买卖股票的最好时机(一)

    假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益 1.你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖出一次 ...

最新文章

  1. Kotlin 中infix,inline,noinline,crossinline ,refied 等的理解
  2. boost::fusion::all用法的测试程序
  3. [Python学习] 专题五.列表基础知识 二维list排序、获取下标和处理txt文本实例
  4. 存钱吃利息存邮政储蓄好还是农业银行好?
  5. 正式发布!鸿蒙,来了!
  6. C语言 如何计算结构体的大小
  7. C语言 底层IO lseek
  8. KafKa基本入门教程
  9. dubbo注册中心介绍
  10. 探讨下Tag标签的数据库设计(千万级数据量) 转
  11. Android Framework - 学习启动篇
  12. 迷宫算法总结(最短路径)
  13. 好听又好看!歌曲视频制作,手把手教你制作音乐视频
  14. 室内外无缝定位导航,GPS系统可以实现吗?
  15. PD协议诱骗取电XSP01支持Type-C 5V9V12V15V20V原理图
  16. clickhouse优缺点总结
  17. Windows下的SSL 应用
  18. 关于小米 角标不显示问题(只有第一次安装应用才会显示角标的问题解决方案)
  19. 计算机组成原理第七章笔记---输入输出
  20. (附源码)springboot中北创新创业官网 毕业设计 271443

热门文章

  1. pomelo广播的实现(chat例子分析)
  2. 1小时撸一套原型,你敢信?
  3. SSH常用操作快捷键
  4. 身份基加密(IBE)
  5. 日期天数记录工具:Days Countdown for Menu Bar
  6. 百胜图咖啡Barsetto滴滴香浓惬意生活
  7. 省份、城市、区域 选择功能模块
  8. 12.2UiPath 数据库的查询
  9. 微信接口 java_【微信支付】企业付款开发者文档
  10. shell学习-斐波那契数列