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])