链接:162. 寻找峰值 - 力扣(LeetCode)
题目:
峰值元素是指其值严格大于左右相邻值的元素。
给你一个整数数组
nums
,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。你可以假设
nums[-1] = nums[n] = -∞
。你必须实现时间复杂度为
O(log n)
的算法来解决此问题。示例 1:
输入:nums =[1,2,3,1]
输出:2 解释:3 是峰值元素,你的函数应该返回其索引 2。示例 2:
输入:nums =[
1,2,1,3,5,6,4] 输出:1 或 5 解释:你的函数可以返回索引 1,其峰值元素为 2; 或者返回索引 5, 其峰值元素为 6。提示:
1 <= nums.length <= 1000
-231 <= nums[i] <= 231 - 1
- 对于所有有效的
i
都有nums[i] != nums[i + 1]
代码:
/**
* @param {number[]} nums
* @return {number}
*/
var findPeakElement = function(nums) {
let n = nums.length
// n为数组的长度
if(n==1||nums[0]>nums[1]) return 0
if(nums[n-1]>nums[n-2]) return n-1
// 考虑边界的问题
for(let i = 1 ; i <= (n-1)/2 ; i++ ){
if(nums[i]>nums[i-1]&&nums[i]>nums[i+1]){
return i
}
if(nums[n-1-i]>nums[n-1-i-1]&&nums[n-1-i]>nums[n-1-i+1]){
return n-1-i
}
// 左右两边同时判断
}
};
链接:69. x 的平方根 - 力扣(LeetCode)
题目:
给你一个非负整数
x
,计算并返回x
的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如
pow(x, 0.5)
或者x ** 0.5
。示例 1:
输入:x = 4 输出:2示例 2:
输入:x = 8 输出:2 解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。提示:
0 <= x <= 231 - 1
代码:
这是第一种解法,首先考虑所有该写法的特殊情况进行处理。从区间【2,x/2】 两头首尾同时查找,找到就结束函数。该写法虽然能过,但是耗时。
/**
* @param {number} x
* @return {number}
*/
var mySqrt = function(x) {
if(x==0) return x
if(x<4) return 1
let i = 2 , j = Math.floor(x/2)
while(i<=j){
if(i*i>x) return i-1
else if(i*i==x) return i
i++
if(j*j<=x) return j
if(i==j) continue
// 考虑i+1后和j相等的情况,避免退出循环
j--
}
};
第二种写法,也就是二分查找
var mySqrt = function(x) {
// 开区间 (left, right)
if(x<=1) return x
let left = 0, right = x;
while (left + 1 < right) { // 开区间不为空
// 循环不变量:left^2 <= x
// 循环不变量:right^2 > x
let m = Math.floor((left + right) / 2);
if (m * m <= x) {
left = m;
} else {
right = m;
}
}
// 循环结束时 left+1 == right
// 此时 left^2 <= x 且 right^2 > x
// 所以 left 最大的满足 m^2 <= x 的数
return left;
};