题目
符合下列属性的数组 arr 称为 山脉数组 :
arr.length >= 3
存在 i(0 < i < arr.length - 1)使得:
arr[0] < arr[1] < ... arr[i-1] < arr[i]
arr[i] > arr[i+1] > ... > arr[arr.length - 1]
给你由整数组成的山脉数组 arr ,返回任何满足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1] 的下标 i 。
示例
示例 1:
输入:arr = [0,1,0]
输出:1
示例 2:
输入:arr = [0,2,1,0]
输出:1
示例 3:
输入:arr = [0,10,5,2]
输出:1
示例 4:
输入:arr = [3,4,5,1]
输出:2
示例 5:
输入:arr = [24,69,100,99,79,78,67,36,26,19]
输出:2
解法1:遍历
python代码
class Solution:
def peakIndexInMountainArray(self, arr: List[int]) -> int:
for i in range(1,len(arr)-1):
if arr[i-1]<arr[i] and arr[i]>arr[i+1]:
return i
解法:二分法
分析
初始值l=1,r=len(arr)-2 这是因为arr.length >= 3,数组至少有3个数 ans=0
循环终止条件mid=(l+r)//2
if arr(mid)>arr(mid+1):
ans=mid;r=mid-1
elif arra(mid)<arr(mid+1):l=mid+1
循环结束后输出ans
python代码
class Solution:
def peakIndexInMountainArray(self, arr: List[int]) -> int:
l=1
r=len(arr)-2
ans=0
while l<=r:
mid=(l+r)//2
if arr[mid]>arr[mid+1]:
ans=mid
r=mid-1
else:
l=mid+1
return ans
题目:有效完全平方数
给你一个正整数 num 。如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。
不能使用任何内置的库函数,如 sqrt 。
示例
示例 1:
输入:num = 16
输出:true
解释:返回 true ,因为 4 * 4 = 16 且 4 是一个整数。
示例 2:
输入:num = 14
输出:false
解释:返回 false ,因为 3.742 * 3.742 = 14 但 3.742 不是一个整数。
提示:
1 <= num <= 231 - 1
解法:二分法
python代码
class Solution:
def isPerfectSquare(self, num: int) -> bool:
l=1
r=46341
while l<=r:
mid=(l+r)//2
if mid**2>num:
r=mid-1
elif mid**2<num:
l=mid+1
elif mid**2==num:
return True
if mid**2!=num:
return False
解法
python代码
class Solution:
def isPerfectSquare(self, num: int) -> bool:
return float.is_integer(pow(num,0.5))
解法:牛顿迭代法
分析
存在整数x使得等于零
解得并且
是凸函数,只要选取初始值大于,迭代值就会大于,故选num作为初始值,向下取整
当前值为 ,该点的斜率方程为
当时解得=(x0 + num / x0) / 2
当,认为迭代可以结束
代码
报错代码
class Solution:
def isPerfectSquare(self, num: int) -> bool:
x0=num
while True:
x1=(x0+num/x0)/2
if x1-x0<=1e-6:
break
else:
x0=x1
x=int(x0)
return x*x==num
正确代码:判断x1和x0谁大是有必要的
class Solution:
def isPerfectSquare(self, num: int) -> bool:
x0 = num
while True:
x1 = (x0 + num / x0) / 2
if x0 - x1 < 1e-6:
break
x0 = x1
x0 = int(x0)
return x0 * x0 == num