算法、李口

111 阅读2分钟

1.基础

1.1.时间复杂度、空间复杂度

/**
 * n^2>nlogn>n>logn>1
 *
 *
 * 时间复杂度:
 * n^2:两层循环
 * nlogn:快速排序,循环+二分
 * n:一层循环
 * logn:二分
 *
 *
 * 空间复杂度:
 * O(n):传入一个数组,处理过程生成一个新的数组和原数组大小一致
 */

2.八大数据结构

/**
 * 8大数据结构
 *
 * 栈
 * 队列
 * 链表
 * 集合
 * 字典(哈希)
 * 树
 * 图
 * 堆
 */

2.1.栈

/**
 * 栈
 *
 * 后进先出
 *
 * JS中没有队列,但是可以用Array实现所有功能
 *
 * 对应数组的pop方法,拿出最后一位
 */

 力扣:
 20,有效的括号
 71,简化路径
 155,最小栈
 392. 判断子序列
 
 拓展:
496,下一个更大元素

2.2.队列

/**
 * 队列
 *
 * 先进先出
 *
 * JS中没有队列,但是可以用Array实现所有功能
 *
 * 对应数组的shift方法,取出数组的第一位
 */

const queue = []
queue.push(0)
queue.push(1)
queue.push(2)

const res = queue.shift()
console.log(res) // 0

2.3.链表

/**
 * 链表
 *
 * 多个元素组成的列表,用next指针连在一起i
 *
 * JS中没有链表,但是可以用Object模拟链表
 *
 * 场景:
 * JS中的原型链
 * 使用链表指针获取JSON的节点值
 */

2.4集合

/**
 * 集合
 *
 * 无序且唯一的数据结构
 *
 * 对应JS中的Set
 *
 * 常用操作:
 * 去重
 * 判断某元素是否在集合中
 * 求交集
 */
// 去重
const arr = [1, 1, 2, 2]
const set = [...new Set(arr)]

// 判断元素是否在集合中
const arr = [1, 1, 2, 2]
const set = new Set(arr)
const res = set.has(3)
console.log(res)

// 交集
const set1 = [...new Set([1, 2])]
const set2 = new Set([1, 3])
const newSet = new Set(set1.filter((e) => set2.has(e)))

// 差集跟交集相反,取反即可

2.5.字典(哈希)

/**
 * 字典:
 *
 * 键值对形式
 *
 * JS中的Map
 */

const m1 = new Map()

// 增
m1.set("key1", "value1")
m1.set("key2", "value2")
m1.set("key3", "value3")

// 删
m1.delete("key1")

// 改
m1.set("key2", "v2")

// 查
const res = m1.get("key2")

2.6.树

/**
 * 树
 *
 * 前端常见的树:
 * DOM树、树级控件、级联选择器
 *
 * JS中没有树,但可以通过Array+Object构建
 *
 * 常用操作:
 * 深度/广度优先遍历、先中后序遍历
 */

2.7.图

/**
 * 图
 *
 * 表示任何的二元关系
 *
 * JS中没有图,但可以用Object+Array构建
 *
 * 表示法:
 * 邻接矩阵、邻接表、关联矩阵
 */

2.8.堆

/**
 * 堆
 * 
 * 特殊的完全二叉树
 * 
 * 所有的节点都大于等于或小于等于它的子节点
 * 
 * 我们可以用数组表示堆
 */

3.

力扣

1.赎金信

// 哈希表、计数、字符串
var canConstruct = function (ransomNote, magazine) {
  const map = new Array(26).fill(0)
  if (magazine.length < ransomNote.length) return false

  for (const iterator of magazine) {
    map[iterator.charCodeAt() - "a".charCodeAt()]++
  }

  for (const iterator of ransomNote) {
    map[iterator.charCodeAt() - "a".charCodeAt()]--
    if (map[iterator.charCodeAt() - "a".charCodeAt()] < 0) {
      return false
    }
  }
  return true
}

2.两数之和,有序数列

// 双指针,数组,二分查找
/**
 * @param {number[]} numbers
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function (numbers, target) {
    let left = 0
    let right = numbers.length - 1

    while (true) {
        let t = numbers[left] + numbers[right]
        if (t === target) {
            return [left + 1, right + 1]
        }
        t > target ? right-- : left++
    }

};

3.