题目描述:
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
分析:
法一「袖珍计算器算法」是一种用指数函数 exp 和对数函数 ln 代替平方根函数的方法。
代码:
import math
#x的算术平方根
class Solution:
def mySqrt(self, x: int) -> int:
if x == 0:
return 0
ans = int(math.exp(0.5 * math.log(x)))
return ans+1 if (ans+1)**2 <= x else ans
s = Solution()
a = s.mySqrt(15)
print(a)
分析:
法二:二分查找法:由于 x 平方根的整数部分ans 是满足 k^2 ≤x 的最大 k 值,因此我们可以对 k进行二分查找,从而得到答案。
二分查找的下界为 0,上界可以粗略地设定为 x。在二分查找的每一步中,我们只需要比较中间元素 mid 的平方与 x的大小关系,并通过比较的结果调整上下界的范围。
代码:
class Solution:
def mySqrt(self, x: int) -> int:
a,b,ans = 0,x,-1
while a <= b:
mid = (a + b)//2
if mid * mid <= x:
ans = mid
a=mid + 1
else:
b=mid - 1
return ans
返回int类型函数时:
return 0:一般用在主函数结束时,按照程序开发的一般惯例,表示成功完成本函数。
return -1::表示返回一个代数值,一般用在子函数结尾。按照程序开发的一般惯例,表示该函数失败;
题目描述:
假设你正在爬楼梯。需要 n
阶你才能到达楼顶。
每次你可以爬 1
或 2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
分析:
动态规划:f(x)表示爬到第x级台阶的方案数,f(x) = f(x-1) + f(x-2),意味着爬到第x阶方案数等于x-1阶加上x-2阶方案数。f(0)=1,f(1)=1,表示从0级爬到0级一种方案,从0级爬到1级1种方案。有了这两个边界条件,就可以向后推导n级正确结果。
代码:
class Solution:
def climbStairs(self, n: int) -> int:
a,b,c,i= 0,0,1,1
while(i <= n):
a = b #a表示爬o级台阶,b表示爬1级台阶
b = c
c = a + b
i += 1
return c