- 时间复杂度 O(1) O(n) O(n²) O(2ⁿ)
记得有次面试, 让我求1 + … n, 我说用for循环. 当时竟然都忘了等差数列公式了…
一个简单的求和
let res = 0 // 1
for(let i; i < arr.length; i++){ // 1
res += arr[i] // n
}
let res = 0
for(const item of number){ 比上面的更简洁, 但似乎不能break
res += item
}
num.reduce((a, b) => a + b) 归并,当时时间复杂度并没有降低
2*n => n
- what & why
- Examples & Different Algorithms
- Different Solution Approaches: Recursion, , Greedy Algorithms (how to tackle and solve problems)
Basics & Time Complexity 基础 和 时间复杂度
Math Algorithms 数学算法
Recursion & Dynamic Programming 递归和动态编程
Search Algorithms 搜索算法
Sorting Algorithms 排序
Space Complexity
Sets(Arrays) Algorithms
More Complex Algorithms & A Blueprint
leetcode 509 斐波那契数列
解法1, 递归, 最简单, 性能最差
O(2²)
function fib(n) {
if (n < 2) {
return n
}
return fib(n - 1) + fib(n - 2)
}
解法2 递归 + 数组记录, O(n) Bottom-up Approach
let arr = [0, 1, 1]
function getFib(n) {
if (n <= 2) return arr[n]
return arr[n] = getFib(n - 1) + getFib(n- 2)
}
console.log(getFib(20))
感觉这种是最好理解的
var fib = function (n) {
let arr = [0, 1, 1]
for(let i = 3; i <= n; i++){
arr[i] = arr[i - 1] + arr[i - 2]
}
return arr[n]
};
不用数组, 用变量倒
let fib = function (n) {
let arr = [0, 1, 1]
if (n < 2) return arr[n]
// 分别代表 dp[i - 1] 和 dp[i - 2]
let dp_i_1 = 1, dp_i_2 = 0
for (let i = 2; i <= n; i++) {
// dp[i] = dp[i - 1] + dp[i - 2];
const dp_i = dp_i_1 + dp_i_2
dp_i_2 = dp_i_1
dp_i_1 = dp_i
}
return dp_i_1
};
leetcode 866. 回文素数
素数
var primePalindrome = function(n) {
if(n === 1) return 2
let max = 12 * Math.pow(10,8)
for(let i = n; i < max; i++) {
if(isH(i) && isPrime(i)) {
return i
}
}
// 判断是不是素数
function isPrime(v){
for(let i = 2; i <= Math.sqrt(v); i ++){
if(v % i === 0){
return false
}
}
return true
}
function isPalindrome(v) {
let str = String(v)
let l = 0,
r = str.length - 1
while (l < r) {
if (str[l] !== str[r]) return false
l++
r--
}
return true
}
};
卡在了 9989900 超时了....
Math.min(1,2,3)
Math.max(1,2,3)
leetcode 231. 2的幂 isPowerOfTwo
- & 是全 1 才为 1
- 5 & 12 => 4
0101 => 5
1100 => 12
0100 => 4
一个数如果是 2 的指数,那么它的二进制表示一定只含有一个 1。
位运算 n&(n-1) 在算法中挺常见的,作用是消除二进制表示中的最后一个 1,可以判断 2 的指数。
/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfTwo = function(n) {
if(n < 1) return false
return (n & (n - 1)) == 0;
};
var isPowerOfTwo = function(n) {
let divide = n
while(divide !== 1) {
if(divide %2 !== 0) return false
divide = divide / 2
}
return true
};
阶乘 54321
recurive 递归写法 O(n)
function factorail() {
if(number === 1) {
return 1
}
return number * factorial(number - 1)
}
performance.now()
参考
bilibili视频