javascript-算法基础-01

  1. 时间复杂度 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


  1. what & why
  2. Examples & Different Algorithms
  3. 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 才为 1
  2. 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视频

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值