Maximum profit of stocks
On-Site Question 1 - SOLUTION
Problem
You've been given a list of historical stock prices for a single day for Amazon stock. The index of the list represents the timestamp, so the element at index of 0 is the initial price of the stock, the element at index 1 is the next recorded price of the stock for that day, etc. Your task is to write a function that will return the maximum profit possible from the purchase and sale of a single share of Amazon stock on that day. Keep in mind to try to make this as efficient as possible.
For example, if you were given the list of stock prices:
prices = [12,11,15,3,10]
Then your function would return the maximum possible profit, which would be 7 (buying at 3 and selling at 10).
Requirements
Try to solve this problem with paper/pencil first without using an IDE. Also keep in mind you should be able to come up with a better solution than just brute forcing every possible sale combination
Also you can't "short" a stock, you must buy before you sell the stock.
Solution
Let's think about a few things before we start coding. One thing to think about right off the bat is that we can't just find the maximum price and the lowest price and then subtract the two, because the max could come before the min.
The brute force method would be to try every possible pair of price combinations, but this would be O(N^2), pretty bad. Also since this is an interview setting you should probably already know that there is a smarter solution.
In this case we will use a greedy algorithm approach. We will iterate through the list of stock prices while keeping track of our maximum profit.
That means for every price we will keep track of the lowest price so far and then check if we can get a better profit than our current max.
Let's see an implementation of this:
def profit(stock_prices): # Start minimum price marker at first price
min_stock_price = stock_prices[0] # Start off with a profit of zero
max_profit = 0 for price in stock_prices: # Check to set the lowest stock price so far
min_stock_price = min(min_stock_price,price) # Check the current price against our minimum for a profit
# comparison against the max_profit
comparison_profit = price - min_stock_price # Compare against our max_profit so far
max_profit = max(max_profit,comparison_profit) return max_profit
profit([10,12,14,12,13,11,8,7,6,13,23,45,11,10])
39
Currently we're finding the max profit in one pass O(n) and in constant space O(1). However, we still aren't thinking about any edge cases. For example, we need to address the following scenarios:
- Stock price always goes down
- If there's less than two stock prices in the list.
We can take care of the first scenario by returning a negative profit if the price decreases all day (that way we can know how much we lost). And the second issue can be solved with a quick len() check. Let's see the full solution:
def profit2(stock_prices): # Check length
if len(stock_prices) < 2:
raise Exception('Need at least two stock prices!') # Start minimum price marker at first price
min_stock_price = stock_prices[0] # Start off with an initial max profit
max_profit = stock_prices[1] - stock_prices[0] # Skip first index of 0
for price in stock_prices[1:]: # NOTE THE REORDERING HERE DUE TO THE NEGATIVE PROFIT TRACKING # Check the current price against our minimum for a profit
# comparison against the max_profit
comparison_profit = price - min_stock_price # Compare against our max_profit so far
max_profit = max(max_profit,comparison_profit) # Check to set the lowest stock price so far
min_stock_price = min(min_stock_price,price) return max_profit
# Exception Raised
profit2([1])
---------------------------------------------------------------------------
Exception Traceback (most recent call last)
<ipython-input-11-7bd2f0c7e63b> in <module>()
1 # Exception Raised
----> 2 profit2([1]) <ipython-input-10-e06adf3c45a7> in profit2(stock_prices)
3 # Check length
4 if len(stock_prices) < 2:
----> 5 raise Exception('Need at least two stock prices!')
6
7 # Start minimum price marker at first price Exception: Need at least two stock prices!
profit2([30,22,21,5])
-1
Great! Now we can prepare for worst case scenarios. Its important to keep edge cases in mind, especially if you are able to solve the original question fairly quickly.
Good Job!
Maximum profit of stocks的更多相关文章
- [Educational Round 59][Codeforces 1107G. Vasya and Maximum Profit]
咸鱼了好久...出来冒个泡_(:з」∠)_ 题目连接:1107G - Vasya and Maximum Profit 题目大意:给出\(n,a\)以及长度为\(n\)的数组\(c_i\)和长度为\( ...
- Yaoge’s maximum profit HDU - 5052
Yaoge’s maximum profit Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- Maximum Profit
Maximum Profit You can obtain profits from foreign exchange margin transactions. For example, if you ...
- Codeforces 1107G Vasya and Maximum Profit 线段树最大子段和 + 单调栈
Codeforces 1107G 线段树最大子段和 + 单调栈 G. Vasya and Maximum Profit Description: Vasya got really tired of t ...
- 【leetcode】1235. Maximum Profit in Job Scheduling
题目如下: We have n jobs, where every job is scheduled to be done from startTime[i] to endTime[i], obtai ...
- HDU5052 Yaoge’s maximum profit(LCT)
典型的LCT操作,但是维护的是一个序列最左边减最右边的最小值,所以要维护左边减右边的最小值del[0]和一个右边减左边的最小值del[1](因为rev标记swap的时候对应的值也要交换).维护的时候d ...
- HDU 5052 Yaoge’s maximum profit 光秃秃的树链拆分 2014 ACM/ICPC Asia Regional Shanghai Online
意甲冠军: 特定n小点的树权. 以下n每一行给出了正确的一点点来表达一个销售点每只鸡价格的格 以下n-1行给出了树的侧 以下Q操作 Q行 u, v, val 从u走v,程中能够买一个鸡腿,然后到后面卖 ...
- codeforces1107G Vasya and Maximum Profit 【模拟】
题目分析: 前缀和啥的模拟一下就行了. 代码: #include<bits/stdc++.h> using namespace std; ; int n,x,d[maxn],sta[max ...
- Codeforces 1107G Vasya and Maximum Profit [单调栈]
洛谷 Codeforces 我竟然能在有生之年踩标算. 思路 首先考虑暴力:枚举左右端点直接计算. 考虑记录\(sum_x=\sum_{i=1}^x c_i\),设选\([l,r]\)时那个奇怪东西的 ...
随机推荐
- HTML5 Canvas ( 填充图形的绘制 ) closePath, fillStyle, fill
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- leetcode108
/** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNo ...
- angular 使用服务共享数据需要注意
在使用服务共享数据时,需要注意一些细节,否则会出现视图不刷新,也不报错这样的问题,遇到了,总结下 如下: <div ng-controller='ctr1'> <a href={{n ...
- @Repository的作用
一.@Repository 是用来注解接口的 如: @Repository("UserDao")public interface IUserDao {} 二,为什么有时候我们不用@ ...
- c++builder XE6 Remote Debuger 远程调试
1.远程目标机器 安装D:\Program Files (x86)\Borland\Remote Debugger\20,没有光盘从已安装的xe6电脑上Bin目录下拷贝文件 bccide.dll bo ...
- Spring MVC 重定向
@RequestMapping("/testRedirect") public String testRedirect(){ System.out.println("te ...
- ABAP-Generate dynpro动态屏幕
1.获取屏幕参数值 FUN: RS_SCRP_GET_SCREEN_INFOS call function 'RS_SCRP_GET_SCREEN_INFOS' exporting dynnr = ' ...
- python之内置函数:map ,filter ,reduce总结
map函数: #处理序列中的每个元素,得到的结果是一个'列表',该列表元素个数及位置与原来一样 filter函数: #遍历序列中的每个元素,判断每个元素得到一个布尔值,如果是true,则留下来 peo ...
- mysql 数据备份及数据迁移
一.使用mysql数据导出进行备份时,会备份整个表的数据,有时候只想备份一部分数据,这个时候可以使用如下方法: 1. 使用insert into 和 select结合: insert into tal ...
- win64+anaconda+xgboost(转)
Windows下安装python版的XGBoost(Anaconda) XGBoost是近年来很受追捧的机器学习算法,由华盛顿大学的陈天奇提出,在国内外的很多大赛中取得很不错的名次, ...