lintcode:买卖股票的最佳时机 III

买卖股票的最佳时机 III

假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格。设计一个算法来找到最大的利润。你最多可以完成两笔交易

样例

给出一个样例数组 [4,4,6,1,1,4,2,5], 返回 6

解题

尝试参考买卖股票的最佳时机 II  提交运行发现错误,每次找到连续的递增子数组记录前后的差值,找到两个最大的。如下程序,其实有问题,最大的差值,可能跨两个子数组的。

如:{1,2,4,2,5,7,2,4,9,0}

三个递增数组:{1,2,4}、{2,5,7}、{2,4,9},起始数组的差是:3、5、7,最大两个和是;5+7= 12

然后对前两数组,第二个数组的起始数大于第一个的起始数,而第二个的结束数大于第一个的结束数,通过递增子数组还大于2个,所有有个更大的其实数组差是:7-1 = 6.

    public int maxProfit(int[] A) {// write your code hereif(A == null || A.length == 0)return 0;if(A.length == 1)return 0;int sum=0;int i = 0;int j = 0;int subSum1 = Integer.MIN_VALUE;int subSum2 = Integer.MIN_VALUE;int tmpSum = 0;while(i < A.length && j < A.length){tmpSum = 0;while(j<A.length-1 && A[j] <= A[j+1])j++;tmpSum += A[j] - A[i];if(subSum1 > subSum2){ // subSum1 是较小者int tmp = subSum1;subSum1 = subSum2;subSum2 = tmp;}// 当 tmpSum 比较小 subSum1  大 的时候更新sumSum1if(tmpSum > subSum1){subSum1 = tmpSum;}i = j + 1;// 下一个位置从新开始j = j + 1;}if( subSum2 == Integer.MIN_VALUE)return subSum1;return subSum1 + subSum2;}
View Code

 

题目标签中有个前后遍历,就想到定义两个数组

left[i] 表示0 - i 并且i是卖出的最大收益

right[i] 表示i - A.length-1 并且i 是买入的最大收益

最后求两个数组的最大和,但是这里时间复杂度是O(N^2)可以进一步的降低的

class Solution {/*** @param prices: Given an integer array* @return: Maximum profit*/public int maxProfit(int[] A) {// write your code hereif(A == null || A.length == 0)return 0;if(A.length == 1)return 0;int sum=0;int[] left = new int[A.length];int[] right = new int[A.length];int min = A[0];//  left[i] 表示在 0 - i 中能够 卖出的最大收益,当是 0的时候表示不买也不卖for(int i =1;i< A.length;i++){if(min<= A[i]){left[i] = A[i] - min;}elsemin = A[i];}int max = A[A.length - 1];// right[i] 表示在 i - A.length-1 中能够卖出的最大收益for( int i = A.length -2;i>=0;i--){if(max >= A[i]){right[i] = max - A[i];}else{max = A[i];}}max = Integer.MIN_VALUE;for(int i = 0;i< A.length;i++){for(int j = i;j<A.length;j++)max = Math.max(max,left[i] + right[j]);}return max;}
};

 

如果我们更改定义的两个数组

left[i] 表示0 - i 这段数组的最大收益

right[i] 表示i - A.length-1 这段数组的最大收益

在求两个数组的和时候只需要线性的时间复杂度

class Solution {/*** @param prices: Given an integer array* @return: Maximum profit*/public int maxProfit(int[] A) {// write your code hereif(A == null || A.length == 0)return 0;if(A.length == 1)return 0;int sum=0;int[] left = new int[A.length];int[] right = new int[A.length];int min = A[0];//  left[i] 表示在 0 - i 中能够 卖出的最大收益,当是 0的时候表示不买也不卖for(int i =1;i< A.length;i++){if(min<= A[i]){left[i] = Math.max(left[i-1], A[i] - min);}else{left[i] = left[i-1];min = A[i];}}int max = A[A.length - 1];// right[i] 表示在 i - A.length-1 中能够卖出的最大收益for( int i = A.length -2;i>=0;i--){if(max >= A[i]){right[i] = Math.max(right[i+1],max - A[i]);}else{right[i] = right[i+1];max = A[i];}}max = Integer.MIN_VALUE;for(int i = 0;i< A.length;i++){max = Math.max(max,left[i] + right[i]);}return max;}
};

 

 

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

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

相关文章

session 学习

Session模型简介Session 是什么呢&#xff1f;简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时&#xff0c;可能有若干个用户浏览正在运正在这台服务器上的网站。当每个用户首次与这台 WWW服务器建立连接时&#xff0c;他就与这个服务器建立了一个Session&#x…

julia学习笔记(二)——基本数据类型

文章目录2 数据类型2.1 整数2.2 浮点数2.3 机器精度2.4 舍入模式2.5 数值字面量系数2.6 零和一的字面量2 数据类型 2.1 整数 如果想要在julia中输入整数字面值。如下&#xff1a; julia> 34 7至于你的整数字面值默认是什么数据类型&#xff0c;这取决于目标系统是32位还是…

微信(支付宝)小程序蓝牙4.0线上项目

需求 &#xff1a; 微信(支付宝)小程序链接BLE4.0 &#xff0c;发送指令到蓝牙硬件过程 &#xff1a; 小程序分为安卓和ios两套系统&#xff0c;支持连接BLE 蓝牙 &#xff0c;其中会遇到机型问题&#xff08;其中安卓&#xff0c;华为荣耀机型&#xff0c;小米&#xff0c;问题…

团队项目计划BACKLOG

团队名称&#xff1a; 铁大老司机 团队成员&#xff1a; 组长&#xff1a;杨超群 组员&#xff1a;杨涛 杜文星 张家军 计划会议过程&#xff1a; 我们小组在周三下午进行了团队会议&#xff0c;会议召开在图书馆大厅&#xff0c;主要内容是进行项目的总体计划安排&#xff0…

pyc文件

学习自&#xff1a;http://blog.csdn.net/sislcb/article/details/4002414 Python解释器:源代码-->字节码-->机器语言不同版本编译后的pyc文件是不同的python提供了内置库文件来实现将python编译成pyc文件。 import py_compile py_compile.compile(rH:/game/test.py) pyc…

C++从0到1的入门级教学(八)——通讯录管理系统

文章目录8 通讯录管理系统8.1 系统需求8.2 菜单功能8.3 退出功能8.4 添加联系人8.4.1 设计联系人结构体8.4.2 设计通讯录结构体8.4.3 main函数中创建通讯录8.4.4 封装添加联系人函数8.5 显示联系人8.5.1 封装显示联系人函数8.5.2 调用显示联系人函数8.6 删除联系人8.6.1 封装检…

【Data Cluster】真机环境下MySQL数据库集群搭建

真机环境下MySQL-Cluster搭建文档 MySQL Cluster简介 MySQL cluster 和 Oracle RAC 完全不同&#xff0c;它采用 无共享架构Shared nothing&#xff08;shared nothing architecture&#xff09;。整个集群由管理节点(ndb_mgmd)&#xff0c;处理节点(mysqld)和存储节点(ndbd)组…

【层次聚类】python scipy实现

层次聚类 原理 有一个讲得很清楚的博客&#xff1a;博客地址 主要用于&#xff1a;没有groundtruth&#xff0c;且不知道要分几类的情况 用scipy模块实现聚类 参考函数说明&#xff1a;pdistsquareformlinkagefcluster scipy.spatial.distance.pdist&#xff1a;计算点之间的距…

Find a girl friend

Find a girl friend Time Limit: 1000ms Memory limit: 262144K 有疑问&#xff1f;点这里^_^ 题目描述 CC wants to find a girl friend, he knows each girls age and name in his class, and each girl’s age is different.. Now he wants to know the youngest girls n…

数据结构杂谈(八)——树(上)

文章目录8 树(上)8.1 引入8.2 树的基础知识8.3 树的存储结构8.3.1 双亲表示法8.3.2 孩子表示法8.4 二叉树8.4.1 基础知识8.4.2 高频考点8.4.3 二叉树的性质8.4.4 二叉链表8.4.5 树和二叉树的转换8.4.6 森林和二叉树的转换8.5 遍历8 树(上) 8.1 引入 我们在前面的章节中一直在…

vs entityframwork Validation failed for one or more entities

问题&#xff1a;添加数据库一条数据时出错 查找异常 catch (DbEntityValidationException dbEx) { foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { Trace.TraceInformation("P…

Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide开源组件加载网络图片的优缺点比较...

在android中的加载网络图片是一件十分令人头疼的事情&#xff0c;在网上有着许多关于加载网络图片的开源库&#xff0c;可以让我们十分方便的加载网络图片。在这里我主要介绍一下我自己在使用Volley, Picasso, Universal-Imageloader的一些使用的感悟。以及最基本的用法介绍。1…

hdu 1754 I Hate It(分块做法)

题意&#xff1a;中文题&#xff0c;不多解释 思路&#xff1a;这个题原本用线段树很容易做&#xff0c;但分块其实也很容易&#xff0c;对于分块的复杂度还不是很会计算&#xff0c;只知道是每次分为sqrt&#xff08;n&#xff09;块&#xff0c;然后一共有sqrt&#xff08;n&…

Maven(一)——快速上手Maven

文章目录Maven概述Maven简介Maven的安装Maven的基本使用IDEA配置Maven依赖管理依赖范围Maven概述 Maven是专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#xff1a; &#xff08;一&#xff09;提供了一套标准化的项目结构 不同的IDE项目结构是不一样的&…

如何定制Activity的标题栏

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.main); //自定义标题栏 mWindow getWindow(); mWindow.setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.titlebar); titlebar.xml <?xml version"1.…

牛客网 牛客小白月赛1 H.写真がとどいています

H.写真がとどいています链接&#xff1a;https://www.nowcoder.com/acm/contest/85/H来源&#xff1a;牛客网这个题数乱了&#xff0c;导致wa了好几次。特别弱智&#xff0c;从A开始往上&#xff0c;就是A,B,C,D,E,F。A的下面就是G开始倒着&#xff0c;G,F,E。我智障&#xff0…

EntityFramework_MVC4中EF5 新手入门教程之三 ---3.排序、 筛选和分页

在前面的教程你实施了一套基本的 CRUD 操作&#xff0c;为Student实体的 web 页。在本教程中&#xff0c;您将添加排序、 筛选和分页到 StudentsIndex的功能。您还将创建一个页面&#xff0c;并简单分组。 下面的插图显示页面当你完成时的样子。列标题是链接&#xff0c;用户可…

eclipes快捷键

本文原创作者&#xff1a;pipi-changing 本文原创出处&#xff1a;http://www.cnblogs.com/pipi-changing/ Ctrl1 快速修复(最经典的快捷键,就不用多说了)CtrlD: 删除当前行 CtrlAlt↓ 复制当前行到下一行(复制增加)CtrlAlt↑ 复制当前行到上一行(复制增加)Alt↓ 当前行和下面一…

fluentd主从配置

fluentd是一个免费的、完全开源的日志管理工具&#xff0c;可以对日志进行收集、处理、存储。对于一些高流量的网站或者特殊的架构&#xff0c;需要fluentd高可用配置。 以下是在测试环境搭建模拟fluentd主从配置&#xff0c;模拟主从切换。 服务器 服务 192.168.199.1 elas…

Hadoop总结

目录 大数据概述 Hadoop大数据开发平台 资源管理YARN 分布式文件系统HDFS 非关系型数据库NOSQL 分布式数据库HBASE 批处理和MapReduce 数据仓库查询分析和Hive 基于内存计算的Spark 流计算和Flink 图计算和PREGEL Hadoop常用命令总结 大数据概述 大数据的4V&#x…