贪心专题6 - leetcode121. Best Time to Buy and Sell Stock/69. Sqrt(x) - Easy

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

你可能感兴趣的:(Leetcode)