【LeetCode】金山面试-二分法计算整数的平方根-数组不连续元素的最大和

1.题目:力扣

给定一个非负整数 x ,计算并返回 x 的平方根,即实现 int sqrt(int x) 函数。

正数的平方根有两个,只输出其中的正数平方根。

如果平方根不是整数,输出只保留整数的部分,小数部分将被舍去。

最优解:

二分法,时间复杂度O(logn),空间复杂度O(1)

python3:

class Solution:
    def mySqrt(self, x: int) -> int:
        l, r, ans = 0, x, -1
        while l <= r:
            mid = (l + r) // 2
            if mid *mid <= x:
                ans = mid
                l = mid + 1
            else:
                r = mid - 1
        return ans

2.题目描述:

给定一个正整数数组, 取若干个元素,使其和最大,且不能取连续的数。

解题:动态规划

动态方程如下

dp[0] = nums[0]

dp[1] = max(nums[1], dp[0])

d[I] = max(num[I] + dp[i-2], dp[i-1])

代码:

扫描二维码关注公众号,回复: 15668279 查看本文章
def demo(nums):
    dp = [0 for i in range(len(nums))]
    dp[0] = nums[0]
    dp[1] = max(dp[0], nums[1])
    for i in range(2, len(nums)):
        dp[i] = max(dp[i-2]+nums[i], dp[i-1])
    return dp[len(nums)-1]

升级:第0个数第N个数不能同时取

思路:分情况讨论

先去前[0,n-1]个数的最大值, 然后再取[1,n]的最大值,最后取两种方式取得的最大值的最大值,作为结果返回

代码:

def demo(nums):
    if len(nums) < 3:
        return max(nums)

    dp = [0 for i in range(len(nums))]
    dp[0] = nums[0]
    dp[1] = max(dp[0], nums[1])
    for i in range(2, len(nums) - 1):
        dp[i] = max(dp[i-2]+nums[i], dp[i-1])

    dpp = [0 for i in range(len(nums))]
    dpp[1] = nums[0]
    dpp[2] = max(dpp[0], nums[1])
    for i in range(3, len(nums)):
        dpp[i] = max(dpp[i-2]+nums[i], dpp[i-1])
    return max(dp[len(nums) - 2], dpp[len(nums) - 1])
    

猜你喜欢

转载自blog.csdn.net/pearl8899/article/details/126255801