121. Best Time to Buy and Sell Stock
题目描述
给定一个数组,第 i 个元素是给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入股票前卖出股票。
例子
Example 1:
Input: [7,1,5,3,6,4]
Output: 5
Explanation: Buy on day 2 (price = 1) and sell on day 5 (price = 6), profit = 6-1 = 5.
Not 7-1 = 6, as selling price needs to be larger than buying price.
Example 2:
Input: [7,6,4,3,1]
Output: 0
Explanation: In this case, no transaction is done, i.e. max profit = 0.
思想
记录到当前位置为止的最小购买价格buy。
遍历数组,若price > buy,则记录当前卖出的利润;否则,buy = price。
解法
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
if not prices:
return 0
res = 0
buy = prices[0] # Record the min-buy up to this time
for price in prices[1:]:
if price > buy:
res = max(res, price - buy)
else:
buy = price
return res
69. Sqrt(x)
题目描述
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
例子
Example 1:
Input: 4
Output: 2
Example 2:
Input: 8
Output: 2
Explanation: The square root of 8 is 2.82842…, and since the decimal part is truncated, 2 is returned.
思想
int(x**0.5)
二分,注意循环的条件以及最后return的值。如果只让left = mid的话,会造成死循环。
解法
class Solution:
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
if x < 2:
return x
left, right = 0, x//2
while left <= right:
mid = (left + right) >> 1
if mid * mid == x:
return mid
if mid * mid > x:
right = mid - 1
else:
left = mid + 1
return left - 1