leetcode 121 股票买卖问题系列

描述:

给一些列数字,表示每条股票的价格,如果可以买卖一次(不能同一天买和卖),求最大利益(即差最大)。

其他三道问题是,如果能买卖无限次,买卖两次,买卖k次。

题一:

实质是求后面一个数减前一个数的最大差值。

维护一个最小值,和当前最大值。只需遍历一次,空间也是常数。

int maxProfit(vector<int>& prices) {if (prices.size() < 1)return 0;int min_ = prices[0];int ret = 0;for (int i = 1; i < prices.size(); i++) {ret = max(ret, prices[i] - min_);min_ = min(min_, prices[i]);}return ret;
}

题二:

只要是后一个数比前一个大,都增。

int maxProfit(vector<int>& prices) {if (prices.size() < 1)return 0;int ret = 0;for (int i = 0; i < prices.size() - 1; i++) {ret += max(prices[i + 1] - prices[i], 0);}return ret;
}

题三:

可进行两次操作。

其中一个思路,可以关注分界点,可以枚举分界点,求左右两边的最优操作,在LeetCode会超时,显然,复杂度n^2。

思考下优化,我们可以计算每个点的最大值,左边不用重复计算,每次分界点往左移,都像题一那样计算最大值即可;

      而右边,其实可以反向计算一遍,但是,右边改成求最小值。

      最后加起来即可。

int maxProfit(vector<int>& prices) {int size = prices.size();if (size < 1)return 0;int* left = new int[size]{0};int* right = new int[size]{0};int ret = 0;int lmin = prices[0];int lmax = 0;for (int i = 1; i < size; i++) {lmax = max(lmax, prices[i] - lmin);left[i] = lmax;lmin = min(lmin, prices[i]);}int rmin = 0;int rmax = prices[size - 1];for (int i = size - 1; i >= 0; i--) {rmin = min(rmin, prices[i] - rmax);right[i] = -rmin;rmax = max(rmax, prices[i]);}for (int i = 0; i < size - 1; i++) {ret = max(ret, left[i] + right[i + 1]);}return max(ret, left[size - 1]);
}

思路二:

int maxProfit(vector<int>& prices) {int n = prices.size();if(n==0) return 0;int sell1 = 0, sell2 = 0, buy1 = INT_MIN, buy2 = INT_MIN;for(int i =0; i<n; i++){buy1 = max(buy1, -prices[i]);sell1 = max(sell1, prices[i]+buy1);buy2 = max(buy2, sell1-prices[i]);sell2 = max(sell2, prices[i]+buy2);}        return sell2;        
}

题四:

动态规划:

其中diff表示今天和昨天的差。

global[i][j] = max(local[i][j], global[i-1][j])

local[i][j] = max(global[i-1][j-1] + max(diff,0), local[i-1][j] + diff)

 

local[i][j]表示最后一次卖出在今天的最大利益,局部最优。

global[i][j]表示全局最优。

第一条式子:要么在今天卖出最优,要么前一天的全局最优。

第二条式子:前者为之前的全局最优加上最后一次交易在今天。

        注意diff,我们要的是不大于j的交易次数;

        如果i - 1天还持有,则i天卖出,共j - 1次操作;如果i-1天不持有,则i - 1天买入,i天卖出,共j次操作。

      后者为i - 1天卖出加上今天diff,表示i - 1天还持有,加上今天的。

int maxProfit(int k, vector<int>& prices) {  if (prices.size() < 2) return 0;  int days = prices.size();  if (k >= days) return maxProfit2(prices);auto local = vector<vector<int> >(days, vector<int>(k + 1));auto global = vector<vector<int> >(days, vector<int>(k + 1));for (int i = 1; i < days ; i++) {int diff = prices[i] - prices[i - 1];  for (int j = 1; j <= k; j++) {  local[i][j] = max(global[i - 1][j - 1], local[i - 1][j] + diff);  global[i][j] = max(global[i - 1][j], local[i][j]);  }  }  return global[days - 1][k];  
}  int maxProfit2(vector<int>& prices) {  int maxProfit = 0;  for (int i = 1; i < prices.size(); i++) {  if (prices[i] > prices[i - 1]) {  maxProfit += prices[i] - prices[i - 1];  }  }  return maxProfit;  
} 

类似题三的做法:

int maxProfit(int k, vector<int>& prices) {int n = prices.size();if(k>n/2){int buy = INT_MIN, sell = 0;for(int i=0; i<n; i++){buy = max(buy, sell-prices[i]);sell = max(sell, buy+prices[i]);}return sell;}vector<int> sell(k+1, 0);vector<int> buy(k+1, 0);for(int i=0; i<=k; i++) buy[i] = INT_MIN;for(int i=0; i<n; i++){for(int j=1; j<k+1; j++){buy[j] = max(buy[j], sell[j-1]-prices[i]);sell[j] = max(sell[j], buy[j]+prices[i]);}}return sell[k];        
}

 

转载于:https://www.cnblogs.com/willaty/p/8304914.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis-jar-lib

csdn的下载好像和我有仇&#xff0c;上传资源不断提示&#xff1a;请您先登录 下载&#xff1a;http://pan.baidu.com/s/1pL2BAzT asm-3.3.1.jar cglib-2.2.2.jar commons-logging-1.1.1.jar mybatis-3.1.1.jar ----以上mybatis的--- log4j-1.2.16.jar ----以上log4j日志--…

java使用队列实现栈思路_算法面试:队列实现栈的方案

声明&#xff1a;码字不易&#xff0c;转载请注明出处&#xff0c;欢迎文章下方讨论交流。前言&#xff1a;Java数据结构与算法专题会不定时更新&#xff0c;欢迎各位读者监督。本篇介绍的是如何用两个队列实现栈的问题。这道题作为上一篇文章算法面试&#xff1a;栈实现队列的…

Uber如何使用go语言创建高效的查询服务

在2015年初我们创建了一个微服务&#xff0c;它只做一件事&#xff08;也确实做得很好&#xff09;就是地理围栏查询。一年后它成了Uber高频查询&#xff08;QPS&#xff09;服务&#xff0c;本次要讲的故事就是我们为什么创建这个服务&#xff0c;以及编程语言新秀Go如何帮我们…

centos7:塔建pure_ftpd虚拟用户

2019独角兽企业重金招聘Python工程师标准>>> 1.下载pure_ftpd&#xff0c;上传服务器,目录路径:/usr/local/src/ 下载地址:https://pan.baidu.com/s/1kWe8FAn 2.安装pure_ftpd cd /usr/local/srctar -xjf pure-ftpd-1.0.36.tar.bz2cd pure-ftpd-1.0.36./configure -…

java.lang.module_如何修复“java.lang.module.FindException:module java.se.ee not found”错误

我正在尝试打包我的kivy应用程序(python3)&#xff0c;但是当我运行命令buildozer -v android debug时&#xff0c;看到这个错误# Cwd /home/javier/.buildozer/android/platform/android-sdkError occurred during initialization of boot layerjava.lang.module.FindExceptio…

寒武纪芯片——有自己的SDK,支持tf、caffe、MXNet

寒武纪芯片产品中心>智能处理器IP智能处理器IP MLU智能芯片 软件开发环境 Cambricon-1A 高性能硬件架构及软件支持兼容Caffe、Tensorflow、MXnet等主流AI开发平台&#xff0c;已多次成功流片 国际上首个成功商用的深度学习处理器IP产品&#xff0c;可广泛应用于计算机视觉、…

maven ssm框架 mysql_SSM框架(IDEA+Spring+SpringMVC+Maven+Mybatis+MySQL)

【实例简介】SSM框架(IDEASpringSpringMVCMavenMybatisMySQL),搭建SSM框架&#xff0c;利用mybatis-plus插件自动生成数据库相关代码。【实例截图】【核心代码】0d399d99-f108-4aaa-9c81-35b505c86e8a└── SSMManager├── pom.xml├── sql│ └── test.sql└── src…

spring框架的引入

spring框架给程序开发带来了春天&#xff0c;在很多项目里&#xff0c;可能不用struts&#xff0c;不用hibernate&#xff0c;但往往都有spring。 why&#xff1f; 因为每个项目都会涉及到对象的创建和对象之间的依赖。 一、传统的MVC开发 mvc的项目框架结构&#xff1a;Enti…

Java编程作业体会_Java作业的几点总结感想

本次博客主要是总结近几次作业&#xff0c;交流一下自己的感受。本次作业主要是对近几次Java课程的巩固作业&#xff0c;第一次作业主要是一些基础的题目&#xff0c;包括选择循环等一些基本语句&#xff0c;其目的在于掌握java一些基本知识&#xff0c;感受出Java与其他语言有…

基于百度语音识别API的Python语音识别小程序

一、功能概述 实现语音为文字&#xff0c;可以扩展到多种场景进行工作&#xff0c;这里只实现其基本的语言接收及转换功能。 在语言录入时&#xff0c;根据语言内容的多少与停顿时间&#xff0c;自动截取音频进行转换。 工作示例&#xff1a; 二、软件环境 操作系统&#xff1a…

spring专业术语了解

组件/框架设计 侵入式设计 引入了框架&#xff0c;对现有的类的结构有影响&#xff1b;即需要实现或继承某些特定类。 例如&#xff1a;Struts框架 非侵入式设计 引入了框架&#xff0c;对现有的类结构没有影响。 例如&#xff1a;Hibernate框架 / Spring框架 控制反转: In…

java修改ldap用户密码_LDAP 用户更改自己的密码

LDAP中采用了ACL的权限控制。在/etc/openldap/slapd.conf文件中&#xff1a;## See slapd.conf(5) for details on configuration options.# This file should NOT be world readable.#include/etc/openldap/schema/corba.schemainclude/etc/openldap/schema/core.schemainclud…

Spring第三篇【Core模块之对象依赖】

tags: Spring 前言 在Spring的第二篇中主要讲解了Spring Core模块的使用IOC容器创建对象的问题&#xff0c;Spring Core模块主要是解决对象的创建和对象之间的依赖关系&#xff0c;因此本博文主要讲解如何使用IOC容器来解决对象之间的依赖关系&#xff01; 回顾以前对象依赖 我…

spring框架结构介绍

Spring提供了一站式解决方案&#xff1a; 1&#xff09; Spring Core spring的核心功能&#xff1a; IOC容器, 解决对象创建及依赖关系 2&#xff09; Spring Web Spring对web模块的支持。 -->可以与struts整合,让struts的action创建交给spring -->spring mvc模式 3…

java通过J2C获取用户名密码_WAS服务器上的J2C别名有什么用途?

这是我LdapTemplate类 公共LdapTemplate getLdapTemplete(字符串ldapID) {WAS服务器上的J2C别名有什么用途&#xff1f;if (ldapID.equalsIgnoreCase(Constants.LDAP1)){if (ldapTemplate1 null){try{PasswordCredential passwordCredential j2cAliasUtility.getAliasDetails…

百度坐标转换API使用

http://api.map.baidu.com/geoconv/v1/?coords121.54759,29.870724&from1&to5&aksGSOaO07WkRHHiCRxxbSQVBn 前提&#xff1a;121.54759,29.870724 是由手机硬件或谷歌地图获取的 错误的方法一&#xff1a; function standard2china(lng,lat){//http://api.map.ba…

Java语言所有异常类均继承自_Java将运行错误分为两类:(__)和(__), 其对应的类均派生自(__)类;...

【单选题】设 x,y 均为已定义的类名,下列声明对象x1的语句中正确的是( )【判断题】构造函数的方法名可以由编程人员任意命名。【单选题】能够实现对原文的鉴别和不可否认性的认证技术是( )。【单选题】设有定义语句int a[]{66,88,99}; 则以下对此语句的叙述错误的是( )。【判断…

Quartz业务类无法注入Spring对象问题

tags: 解决错误, titile: Quartz业务类无法注入Spring对象问题 Quartz业务类无法注入Spring对象问题 在刚开始遇到的时候还以为是Spring配置哪里错误了&#xff0c;结果搞了那么久&#xff0c;才知道Quartz与Spring注入对象是不关联的。。 因为Quartz的业务Job对象是由Quartz来…

如何解决ajax跨域问题

原文&#xff1a;http://www.congmo.net/blog/2012/06/27/ajax-cross-domain/ 跨域问题 起 因是这样的&#xff0c;为了复用&#xff0c;减少重复开发&#xff0c;单独开发了一个用户权限管理系统&#xff0c;共其他系统获取认证与授权信息&#xff0c;暂且称之为A系统&#xf…

spring bean创建细节

1) 对象创建&#xff1a; 单例/多例 scope"singleton", 默认值&#xff0c;即默认是单例【service/dao/工具类】 scope"prototype", 多例&#xff1b;【Action对象】 2) 什么时候创建? scope"prototype" 在用到对象的时候&#xff0c…