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