算法核心框架

1 总览

关于数据结构和算法的精炼总结

  • 所有的数据结构,底层皆为数组(顺序存储)和链表(链式存储)
  • 数据结构的关键点在于遍历和访问,即元素的增删改查等基本操作
  • 所有的算法,本质皆为穷举
  • 穷举的关键点在于无遗漏和无冗余。熟悉掌握算法框架,可以做到无遗漏;充分利用信息,可以做到无冗余。

1.1 数据结构的存储方式

如上文所讲,数据结构的存储方式只有两种:数组链表

1.2 数据结构的基本操作

对于任何数据结构,其基本操作为遍历和访问,具体来讲就是增删改查

  • 线性结构:使用for|while循环
  • 非线性结构:使用递归遍历

2 算法的本质

算法的本质是穷举

穷举的两个关键:

  • 无遗漏:出现遗漏是对算法框架的掌握不到位,不能正确穷举代码
  • 无冗余:没有充分利用有效信息

面对一道算法题,两个维度思考:

  • **如何穷举?**无遗漏穷举出所有的可能解
  • 如何聪明地穷举?避免所有的冗余计算,尽可能少地消耗资源求出答案

2.1 如何穷举?

递归类问题回溯算法动态规划算法等算法的解题关键在于如何正确地穷举。

  • 回溯算法的核心在于遍历
  • 动态规划核心在于分解问题

2.2 如何聪明地穷举?

二分搜索算法并查集贪心算法

3 数组|链表系列算法

3.1 单链表

单链表常用的解题技巧为双指针,属于聪明穷举一类。

3.2 数组

数组比较灵活,常见的解题技巧有:

4 二叉树算法

二叉树的递归解法可以分为两类思路,第一类是遍历一遍二叉树得出答案,第二类可以通过分解问题计算出答案。

二叉树常用的解题技巧有:

4.1 遍历思维模式

例如二叉树的前|中|后序遍历等。

4.2 分解问题的思维模式

计算二叉树最大深度的问题,可以使用如下的解法:

int maxDepth(TreeNode root) {
    if (root == null) {
        return 0;
    }
    // 递归结算左右子树的最大深度
    int leftMax = maxDepth(root.left);
    int rightMax = maxDepth(root.right);
    // 整棵树的最大深度就是左右子树的最大深度 + 1 (根节点)
    int res = Math.max(leftMax, rightMax) + 1;
    return res;
}

关于二叉树的核心算法,可以参考文章[二叉树算法]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值