69、x的平方根。
给你一个非负整数 x
,计算并返回 x
的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5)
或者 x ** 0.5
。
示例 1:
输入:x = 4 输出:2
示例 2:
输入:x = 8 输出:2 解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
【分析】拓展一个与题目无关的手撸平方根的方法。
a² = x² + b; //a指要求平方根的数 指距离该数最近的平方根 b为它们的差值
//eg: a = 110 则 x = 100, b = 10 注意a²>>b
x² - a² = b;
(√x - a)(√x + a) = b;
√x = a + b / (a + √x ); //求小数点后一位
//将√x代入右边
√x = a + b / (a + a + b / (a + √x )); //求小数点后两位
//依次迭代
对于此题而言 只需要找到比x小的最大平方根即可,使用遍历的方法。注意越界的处理方式。
int mySqrt(int x) {
if (x == 0) return x;
int i = 1;
//for (; i * i <= x; i++); 会出错 越界
for (; i <= x / i; i++);
return --i;
}
55、跳跃游戏
给你一个非负整数数组 nums
,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true
;否则,返回 false
。
示例 1:
输入:nums = [2,3,1,1,4] 输出:true 解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例 2:
输入:nums = [3,2,1,0,4] 输出:false 解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
【分析】分享一个宝藏博主
贪心算法,怎么跳跃不重要,关键在覆盖范围 | LeetCode:55.跳跃游戏_哔哩哔哩_bilibili
核心思想就是不关注怎么样跳跃、跳多少步,而是依据贪心算法的思想,看到底最多可以跳到哪。
int max(int num1, int num2) {
if (num1 >= num2) return num1;
return num2;
}
bool canJump(int* nums, int numsSize) {
if (numsSize == 1) return true;
int range = 0;
//注意这里i的结束条件是真正的取值范围终点 如果只是依次遍历数组,会访问到不该访问的路径
for (int i = 0; i <= range; i++) {
range = max(nums[i] + i, range);
//这里是避免[2, 0]这样的数组报错 所以不是完全等于 应该是大于或等于
if (range >= numsSize - 1) return true;
}
return false;
}