278. 第一个错误的版本
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 n
个版本 [1, 2, ..., n]
,你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version)
接口来判断版本号 version
是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
给定 n = 5,并且 version = 4 是第一个错误的版本。
调用 isBadVersion(3) -> false
调用 isBadVersion(5) -> true
调用 isBadVersion(4) -> true
所以,4 是第一个错误的版本。
思路: 使用二分折半查找,这是一个比较典型的查找题目。
代码如下:
# The isBadVersion API is already defined for you.
# @param version, an integer
# @return a bool
# def isBadVersion(version):
class Solution:
def firstBadVersion(self, n):
"""
:type n: int
:rtype: int
"""
#### 使用折半查找
begin = 0
end = n
while(True):
mid = begin + (end - begin) // 2
if isBadVersion(mid) == False and isBadVersion(mid + 1) == True:
return mid + 1
elif isBadVersion(mid) == False and isBadVersion(mid + 1) ==False:
begin = mid
elif isBadVersion(mid) == True and isBadVersion(mid + 1) == True:
end = mid
121. 买卖股票的最佳时机
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入股票前卖出股票。
示例 1:
输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
示例 2:
输入: [7,6,4,3,1] 输出: 0 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0代码如下: 用时44ms,思路代码请查看代码注释
class Solution:
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
#### 思想就是找到数组中最大数以及最小数,同时也要考虑数组元素的顺序,特殊情况是给定的数组元素是逆序的,那么返回值为0
if len(prices) == 0:
return 0
max_profit = 0
min_price = prices[0]
for price in prices:
min_price = min(price, min_price)
max_profit = max(max_profit, (price - min_price))
return max_profit