这个系列没啥花头,就是纯 leetcode 题目拆解分析,不求用骚气的一行或者小众取巧解法,而是用清晰的代码和足够简单的思路帮你理清题意。让你在面试中再也不怕算法笔试。
46. x 的平方根 (sqrtx)
标签
- 数学
- 简单
题目
这里不贴题了,leetcode打开就行,题目大意:
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。
相关知识
二分法处理,二分查找是核心思想,可查看这篇 二分查找
首先我们确认题目是查找根,而且是有单调性的,二分法可用。
基本步骤
- 特判
- 声明左右边界指针,和制造一个中点
- 看情况
- 如果 mid 的平方正好等于 x,则返回 mid
- 如果 mid 的平方小于 x,说明平方根落在 mid 和 right 之间,left = mid + 1
- 如果 mid 的平方大于 x,说明平方根落在 left 和 mid 之间,right = mid - 1
写法实现
/**
* @param {number} x
* @return {number}
*/
var mySqrt = function(x) {
// 特判
if (x === 0) {
return 0
}
// 二分法,先声明左右边界
let [left, right, res] = [1, x, 0]
while (left <= right) {
let mid = left + Math.floor((right - left) / 2)
if ( x === mid * mid) {
return mid
} else if (mid * mid < x) {
left = mid + 1
res = mid
} else {
right = mid - 1
}
}
return res
};
console.log(mySqrt(10))
另外这个问题还能用些数学方式解决,有兴趣可以了解:牛顿迭代
这里不赘述直接上代码:
var mySqrt = function(x) {
let res = x
while(res * res > x) {
res = Math.floor((res + Math.floor((x / res))) / 2)
}
return res
};
47. 爬楼梯 (climbing-stairs)
标签
- 动态规划
- 数学
- 简单
题目
这里不贴题了,leetcode打开就行,题目大意:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
相关知识
经典的爬楼梯问题(简单的 DP)
一个楼梯可以由 n-1 和 n-2 的楼梯爬上来。
完全不了解动态规划请移步 动态规划
基本步骤
我们再次重复步骤加深印象
- 寻找最优子结构(状态表示)
- 归纳状态转移方程(状态计算)
- 边界初始化
-
状态表示:
dp[i]表示 爬到第i级台阶的方案数 -
状态转移方程: 因为一次只能爬 1 级或 2级,所以状态只可能从 dp[i - 1] 和 dp[i - 2] 这两个状态总和,于是方程就是
dp[i] = dp[i - 1] + dp[i - 2] -
边界条件: 我们是从第 0 级开始爬的,所以从第 0 级爬到第 0 级我们可以看作只有一种方案,即
f(0) = 1;从第 0 级到第 1 级也只有一种方案,即爬一级,f(1) = 1。依次往下推导就行,我们惊奇地发现,这不是斐波那契数列吗。
写法实现
var climbStairs = function(n) {
let dp = []
dp[0] = 1, dp[1] = 1
for (let i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2]
}
return dp[n]
};
console.log(climbStairs(3))
另外向大家着重推荐下这位大哥的文章,非常深入浅出,对前端进阶的同学非常有作用,墙裂推荐!!!核心概念和算法拆解系列
今天就到这儿,想跟我一起刷题的小伙伴可以加我微信哦
搜索我的微信号infinity_9368,可以聊天说地
加我暗号 "天王盖地虎" 下一句的英文,验证消息请发给我
presious tower shock the rever monster,我看到就通过,暗号对不上不加哈,加了之后我会尽我所能帮你,但是注意提问方式,建议先看这篇文章:提问的智慧