哈喽大家好,这里是万诺工作室,接下来将会陆续推出一系列关于面试的时候常见的手撕代码的题目,欢迎大家交流!


一、题目描述

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。

注意:你不能在买入股票前卖出股票。

示例 1:

输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。

示例 2:

输入: [7,6,4,3,1]输出: 0解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

二、题目解析    a.暴力解法首先先将一种基本上所有同学都可以第一时间想到的方法,就是直接暴力遍历出所有的情况,也就是说把虽有可能进行买卖的日子的组合都列举出来,比如说数组为arr = [v1,v2,v3],那么所有的可能就是{v1买,v2卖},{v1买,v3卖},{v2买,v3卖},只要把这所有的组合产生的收益都列举出来并且求出一个最大值即可得到正确答案。但是这种做法的缺点非常的明显,时间复杂度直接到了O(n^2),不清楚O(n^2)复杂度是什么概念的同学可以看一下上一篇文章。下面附上暴力解法的代码:

public class Solution {    public int maxProfit(int prices[]) {            //用来记录最大的收益           int maxprofit = 0;                         //两个循环即可遍历出所有的情况           for (int i = 0; i < prices.length - 1; i++) {             for (int j = i + 1; j < prices.length; j++) {               //每一种情况产生的收益                int profit = prices[j] - prices[i];               maxprofit = Math.max(maxprofit,profit);              }                                }                        return maxprofit;       }}

暴力解法的代码固然简单,逻辑也非常地清晰,但是面试手撕代码的时候你写出这样的代码,必定会被面试官追问一句“有没有更好的解法”    b.一次遍历的解法 对于这道题来说,其实有一种解法只需要一次遍历即可,这种解法蕴含了动态规划的思想,但是也不能算是很标准的动态规划的题目。具体思路是这样的:首先我们要知道,对于每一天(除了第一天),都有可能成为卖股票的一天,或者说是所有组合的卖股票的日子就是从数组的第二位到最后一位了,没有其他选择了,对吧。那么对于这n-1种可能,每一种可能的最优解,就是在第i位(i∈[1,n-1])之前选一个价格最低的来买,不需要把所有的可能都列举出来。怎么想出来这个想法呢?关键还是在于分解成子问题。把大情况分解成小情况,这道题目就是把所有的组成分解成n-1个在第i天卖出的情况(i∈[1,n-1])。下面就是具体的实现代码:

class Solution {    public int maxProfit(int[] prices) {        if(prices.length == 0)             return 0;        int maxprofit = 0;//记录最大收益        int minprofit = prices[0];//记录i之前的最小价格        for(int i = 1;i            maxprofit = Math.max(maxprofit,prices[i]-minprofit);            minprofit = Math.min(minprofit,prices[i]);        }        return maxprofit;    }}

所以呀,遇到这种问题切忌一开始就直接暴力解,好好想想到底有没有什么地方可以优化,虽然是一道非常简单的题目,但是还是难倒了很多同学。


关注万诺工作室,持续输出对你有用的干货!       

数位 dp 最低位最高位之差绝对值大于2_面试必备——手撕代码(2)“买卖股票的最佳时机”...相关推荐

  1. 数位 dp 最低位最高位之差绝对值大于2_人教版二年级数学下册复习重点考点分析带测试题2套,给孩子下载练习!...

    注:文章结尾有电子版下载链接 往期回顾: 部编版二年级语文下册:教学视频+图文课件+知识点+同步练习 人教版二年级数学下册:视频+课件+知识点+练习及测试卷 北师大版二年级数学下册:视频+课件+知识点 ...

  2. 数位 dp 最低位最高位之差绝对值大于2_王者荣耀 各战区 全英雄(无艾琳)省与市 最低战力查询分享 (评论有表格链接)...

    2020年10月31日 前几天说更新结果鸽了 太累了,懒得更 这次更新了台湾的,结果发现原来台湾最低哈哈哈. 全英雄平均战力澳门比香港低70分,台湾比澳门低17分. 更新了澳门10月31日战力,可以看 ...

  3. 数位 dp 最低位最高位之差绝对值大于2_2020赛季30大球员系列:第27位 微笑刺客 肯巴沃克...

    前言 肯巴-沃克,上季篮球生态预测本季排名16名,本季沈知二投票排名第27位,较预测下降11位. 2020赛季,沃克的ORPM(进攻真实正负值)排在联盟控位第12位,RPM(真实正负值)排在联盟第84 ...

  4. 123. 买卖股票的最佳时机 III ( 三维dp )

    LeetCode:123. 买卖股票的最佳时机 III 之前的含手续费定义了两个状态(持股与不持股), 含冷冻期定义了三个状态(持股, 不持股冷冻期, 不持股非冷冻期), 都是二维数组. 本题除了持股 ...

  5. 【dp】买卖股票的最佳时机系列题目

    文章目录 121. 买卖股票的最佳时机 122. 买卖股票的最佳时机 II 309. 最佳买卖股票时机含冷冻期 123. 买卖股票的最佳时机 III 188. 买卖股票的最佳时机 IV 121. 买卖 ...

  6. 数位 dp 相邻位数字差值的绝对值不能超过 2_干货来了!13种行测数字推理技巧总结...

    数学除了公式要记忆,解题技巧同样需要"记忆"所谓的解题技巧来源于实战,运用于实战 它是在通过大量做题.充分理解和把握命题规律的基础上形成的解题方法论今天陕西京佳教育为大家盘点13种 ...

  7. 数位 dp 相邻位数字差值的绝对值不能超过 2_贵州专注WIKA数字压力表品牌推荐...

    贵州专注WIKA数字压力表品牌推荐 k52gh264 贵州专注WIKA数字压力表品牌推荐 校验器漏油或者是油杯针型阀不光滑导致密封性不好,也可能是弹簧管有裂缝...对标准器的误差要求检定精密压力表时标 ...

  8. 数位 dp 相邻位数字差值的绝对值不能超过 2_维懂百科——绝对值编码器的“绝对式”的定义...

    什么是绝对值编码器的"绝对式"的定义 旋转编码器是工业中重要的机械位置角度.长度.速度反馈并参与控制的传感器,旋转编码器分增量值编码器.绝对值编码器.绝对值多圈编码器. 从外部接收 ...

  9. 数位 dp 相邻位数字差值的绝对值不能超过 2_XMZD-102 数字温度仪

    XMZD-102 数字温度仪 单回路数显仪表是采用微处理器进行数字运算,可对各种非线性信号进行高精度的线性矫正的仪器. 概述 单回路数显仪表显示控制仪适用于各种温度.压力.液位.长度等的测量控制.采用 ...

  10. 数位dp模板 最高位最低位_无纸化办公入门指南(数位板篇)

    居家办公的这段时间,你们有没有遇到无纸化办公的问题? 作为一名编辑,在我社规定不能寄纸稿的情况下,看电子稿成了常态.如果是word版尚且可以批注,不影响工作效率.但如果是PDF呢?怎样保证改稿的效率? ...

最新文章

  1. 数据结构(08)— 线性单链表基本操作
  2. 第十六届全国大学生智能汽车竞赛全国总决赛承办申请汇报
  3. java ssl https 连接详解 生成证书
  4. 常见开发需求之前端利器webstorm中的git和快捷键
  5. Codeforces 1314 题解
  6. java获取gbk文件名 linux_Java读取linux系统中文文件名时候乱码,并显示文件不存在...
  7. mysql安装配置yum_在CentOS 7下使用yum配置MySQL源并安装MySQL
  8. 第十一届蓝桥杯省赛C++组试题 第3题 求阴影面积
  9. String.raw()方法
  10. NUll is null like
  11. Hive Union操作中的隐式转换
  12. python必备入门代码-20行python代码的入门级小游戏的详解
  13. 如何搞一个自制表情包项目,看这个开源项目就够了!
  14. iOS ASI--文件下载
  15. 我了解的软件测试基本概念
  16. 一个单位球体积理清二三重积分计算与体积的求解方法(含旋转体体积)
  17. C# 报错 provisional headers are shown learn more
  18. php视频边下边播,PHP + NGINX 控制视频文件播放,并防止文件下载
  19. 国产手机再次发力,是否可以阻击三星苹果
  20. Fleck说明文档翻译

热门文章

  1. 关于深度学习caffe for Windows编译入门
  2. Java IO-03 字节流和字符流
  3. Centos7.4 安装Docker CE版
  4. Python 爬取 猫眼 top100 电影例子
  5. scapy:收发数据包
  6. 根据TTL值判断目标主机的类型
  7. dede调用一个栏目下的子栏目
  8. Android 学习之补间(Tween)动画
  9. Linux进程内核栈与thread_info结构详解--Linux进程的管理与调度(九)
  10. 【python入门到实践1】简介和环境搭建