我们的口号是:使用最简洁的代码,完成AC:)
题目介绍
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
示例1
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例2
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
示例3
输入:nums = [], target = 0
输出:[-1,-1]
提示:
- 0 <= nums.length <= 105
- -109 <= nums[i] <= 109
- nums 是一个非递减数组
- -109 <= target <= 109
题目分析
本文介绍一种投机取巧的方法来求解,将开方问题转换为n次方问题。
开方和累成之间存在以下关系:
x
=
x
1
/
2
=
(
e
l
n
x
)
1
/
2
=
e
1
/
2
l
n
x
\sqrt{x} = x^{1/2} = (e^{lnx})^{1/2} = e^{1/2lnx}
x=x1/2=(elnx)1/2=e1/2lnx
因此,我们可以使用math.log()与math.exp()函数来解决该题。
内置的 exp 函数与 log 函数都很快,可以当作O(1)哈:)
指数函数和对数函数的参数和返回值均为浮点数,运算过程中会存在误差,因此我们在输出时添加了验证。
python代码
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