leecode刷题(2)-- 买卖股票的最佳时机
时间:2022-06-16
本文章向大家介绍leecode刷题(2)-- 买卖股票的最佳时机,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
买卖股票的最佳时机
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例:
输入: [7,1,5,3,6,4] 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
代码如下:
public class MaxProfit {
public int maxProfit(int[] prices) {
if (prices == null || prices.length == 0) {
return 0;
}
int profit = 0;
for (int i = 1; i < prices.length; i++) {
if (prices[i-1] < prices[i]) {
profit += prices[i] - prices[i-1];
}
}
return profit;
}
public static void main(String[] args) {
int[] a = {1,2,3,4,9};
MaxProfit profit = new MaxProfit();
int maxProfit = profit.maxProfit(a);
System.out.println(maxProfit);
}
}
算法:贪心算法(局部最优解即为整体最优解)
比如我们假定数组为 [7, 1, 5, 3, 6, 4]
依照题目规定,要获得最大值的话,要求相邻子数组的差应该大于或等于0(这样才能“低买高卖”),也就是说,这个连续子数组应该是递增的。
我们还是来看例子,依据“低买高卖”的原则,我们可以得到两种结果:
(1) profit1 = (5-1) + (6-3) = 7
(2) profit2 = (6-1) = 5
第一种结果为相邻比大小并相减并连续求和,第二种为找到最大和最小值相减(遵循“低买高卖”),明显第一种更符合题目利益最大化的要求。
然后我们继续优化,可以在数值递增的过程中连续取差值求和,而不用在数值停止递增找到最大值,这样我们的子数组便都是递增的了。如果子数组中的第二个数字大于第一个数字,我们便能获得该子数组的最大利润,推广到整个数组,我们将获得的总和将是最大利润。这便是贪心算法。
复杂度
- 时间复杂度:O(n) 。遍历一次。
- 空间复杂度:O(1) 。需要常量的空间。
- 从头编写 asp.net core 2.0 web api 基础框架 (1)
- 使用Identity Server 4建立Authorization Server (6) - js(angular5) 客户端
- 如何实现超高并发的无锁缓存?
- 使用Identity Server 4建立Authorization Server (5)
- 多库多事务降低数据不一致概率
- 利用Python实现DGA域名检测
- 一个“爆款”成功的API,都离不开这8条设计准则
- RavenDb学习(八)高级特性上半部分
- 微信钱包中58到家首页为什么这么快
- hbase源码系列(二)HTable 探秘
- hbase源码系列(三)Client如何找到正确的Region Server
- hbase源码系列(五)Trie单词查找树
- 如何在特定的渗透测试中使用正确的Burp扩展插件
- hbase源码系列(十一)Put、Delete在服务端是如何处理?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- cmd里如何查看历史命令并执行
- akka-typed(10) - event-sourcing, CQRS实战
- 【每日一题】37. Sudoku Solver
- A quick introduction to innodb_ruby (2.对innodb_ruby的简单介绍)
- Webkit 内核初探
- 配置跨域后,框架帮我们做了什么?
- python应用(1):安装与使用
- TCP粘包和拆包
- 性能测试必备命令(1)- free
- 记一次有趣的挖矿病毒
- 性能测试必备知识(10)- Linux 是怎么管理内存的?
- Ng-Matero V10 正式发布!
- 30.Python装饰器
- 13-5 vi查找和替换
- 设计模式~适配器模式