【玩转算法】查找

  1. 两类查找问题.

    1. 查找有无:元素’a’是否存在? 使用 set:集合,不会有重复值
    2. 查找对应关系(键值对应):元素’a’出现了几次? 使用 map: 字典,字典是一一映射的
  2. 在查找问题中,数组的有序性非常重要,使用二分查找可以更快,使用查找表方法时一定要想清楚到底要查找什么,键和值分别是什么。

  3. set 和 map

    1. 通常语言的标准库中都内置 set 和 map ,通常被称为容器类,容器类屏蔽实现细节,所以要了解语言中标准库里常见容器类的使用

    2. set 和 map 常见操作:

      1. insert,添加
      2. find,查找
      3. erase,删除
      4. change (map),改变
    3. set 和 map 不同底层实现的时间复杂度

      普通数组实现顺序数组实现二分搜索树(平衡)哈希表
      插入O(1)O(n)O(logn)O(1)
      查找O(n)O(logn)O(logn)O(1)
      删除O(n)O(n)O(logn)O(1)
  4. 数据的顺序性,如二分搜索树可以轻易实现以下操作

    1. 数据集中的最大值和最小值
    2. 某个元素的前驱利后继
    3. 某个元素的floor和ceil
    4. 某个元素的排位rank
    5. 选择某个排位的元素select
  5. 哈希表的缺点是失去了数据的顺序性

  6. 判断字符串t是否是字符串s变换字符顺序后得到的结果

    1. 空串处理?
    2. 字符集定义?
  7. 给出一个模式(pattern) 以及一个字符串,判断这个字符串是否符合模式?

    1. 字符集定义?
    2. 空串符合任意模式?还是不符合任意模式?
  8. 判断两个字符串是否同构?如果我们能够寻找到一个字符集到字符集的映射,使得通过这个字符集的映射,s可以转变为t,则称为s和t同构。

    1. 字符集定义?
    2. 空串?
    3. 是否可以一个字母映射到自己?
  9. 给出一个整型数组nums,返回这个数组中两个数字的索引值i和j,使得nums[i] + nums[j]等于一个给定的target值

    1. 索引从0开始计算还是从1开始计算?
    2. 没有解怎么办?
    3. 保证有唯一解吗?有多个解怎么办?
  10. 给出一个整形数组,寻找其中的所有不同的三元组(a,b,c),使得a+b+c=0,如nums=[-1,0, 1,2,-1,-4],结果为[[-1,0, 1],[-1,-1,2]]

    1. 不同的三元组?考虑排列组合吗?
    2. 如果有多个解,解的顺序?
    3. 如果没有解?
  11. 给出一个整形数组,寻找其中的三个元素a,b,c,使得a+b+c的值最接近另外一个给定的数字target

    1. 如果有多个解,其和target值的接近程度一样怎么办?
    2. 如果没解? (可不可能没解? )
  12. 给出一个字符串数组,将其中所有可以通过颠倒字符顺序产生相同结果的单词进行分组。

    1. 字符集定义?
    2. 大小写敏感?
  13. 给出2D平面上的n个点,求出最多有多少个点在一条直线上?

    1. 点坐标的范围
    2. 点坐标的表示(整数?浮点数?浮点误差? )
  14. 注意整型溢出的问题

  15. 经典例题

    1. LeetCode 第 349 题:两个数组的交集 ,set
    2. LeetCode 第 350 题:两个数组的交集 II,map
    3. LeetCode 第 242 题:有效的字母异位词
    4. LeetCode 第 202 题:快乐数
    5. LeetCode 第 290 题:单词规律
    6. LeetCode 第 205 题:同构字符串
    7. LeetCode 第 451 题:根据字符出现频率排序
    8. LeetCode 第 1 题:两数之和
    9. LeetCode 第 15 题:三数之和
    10. LeetCode 第 18 题:四数之和,灵活选择键值
    11. LeetCode 第 16 题:最接近的三数之和
    12. LeetCode 第 454 题:和为K的子数组
    13. LeetCode 第 49 题:字母异位词分组
    14. LeetCode 第 447 题:回旋镖的数量,灵活选择键值
    15. LeetCode 第 149 题:直线上最多的点数
    16. LeetCode 第 219 题:存在重复元素 II,滑动窗口+查找表
    17. LeetCode 第 217 题:存在重复元素
    18. LeetCode 第 220 题:存在重复元素 III,二分搜索树底层实现的顺序性
玩转二叉树算法通常涉及对二叉树的基本操作,如遍历(前序、中序、后序)、搜索、插入、删除等。以下是几个常见的二叉树算法实现思路: 1. **前序遍历**:根节点 -> 左子树 -> 右子树。递归或栈辅助实现,先访问根节点,然后依次遍历左子树和右子树。 2. **中序遍历**:左子树 -> 根节点 -> 右子树。适用于构建有序序列,对于每个节点,先遍历它的左子树,然后访问它,最后遍历右子树。 3. **后序遍历**:左子树 -> 右子树 -> 根节点。常用于计算表达式树,例如计算前缀、中缀或后缀表达式的值。 4. **查找**:从根节点开始,如果目标值等于当前节点的值,则返回该节点;若小于当前值,进入左子树;反之进入右子树,直到找到或者遍历完都没有找到。 5. **插入**:从根节点开始,如果为空则插入新节点作为新的根;否则比较节点值大小,选择左或右子树递归插入。 6. **删除**:根据要删除节点的不同情况(空、只有一个孩子、有两个孩子),有不同的操作,涉及到替换、旋转等复杂步骤。 7. **平衡二叉树**:比如AVL树、红黑树,它们通过维护特定的平衡条件(如左右子树高度差不超过1),使得查询性能保持稳定。 算法实现时,核心思路是递归或迭代,利用节点之间的父子关系进行操作。同时,考虑时间和空间复杂度,尤其是在大规模数据下,高效的算法设计至关重要。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值