算法与数据结构

标签(空格分隔): 算法与数据结构


数据结构题目

数组

  • 面试题3.1 数组中重复的数字
  • 面试题4 二维数组中的查找
  • 面试题21 调整数组顺序使奇数位于偶数前面
  • 面试题29 顺时针打印矩阵
  • 面试题39 数组中出现次数超过一半的数字
  • 面试题41 数据流中的中位数
  • 面试题42 连续子数组的最大和
  • 面试题45 把数组排成最小的数
  • 面试题61 扑克牌顺子
  • 面试题66 构建乘积数组

字符串

  • 面试题5 替换空格
  • 面试题20 表示数值的字符串
  • 面试题38 字符串的排列
  • 面试题50.1 第一个只出现一次的字符位置
  • 面试题50.2 字符流中第一个不重复的字符
  • 面试题58.1 翻转单词顺序列
  • 面试题58.2 左旋转字符串
  • 面试题67 把字符串转换成整数

栈和队列

  • 面试题9 用两个栈实现队列
  • 面试题30 包含min函数的栈
  • 面试题31 栈的压入、弹出序列
  • 面试题59 滑动窗口的最大值

链表

  • 面试题6 从尾到头打印链表
  • 面试题18.1 在O(1)时间内删除链表节点
  • 面试题18.2 删除链表中重复的结点
  • 面试题22 链表中倒数第k个结点
  • 面试题23 链表中环的入口结点
  • 面试题24 反转链表
  • 面试题25 合并两个排序的链表
  • 面试题35 复杂链表的复制
  • 面试题52 两个链表的第一个公共结点
  • 面试题62 圆圈中最后剩下的数

二叉树

  • 面试题7 重建二叉树
  • 面试题8 二叉树的下一个结点
  • 面试题26 树的子结构
  • 面试题27 二叉树的镜像
  • 面试题28 对称的二叉树
  • 面试题32.1 不分行从上往下打印二叉树
  • 面试题32.2 把二叉树打印成多行
  • 面试题32.3 按之字形顺序打印二叉树
  • 面试题33 二叉搜索树的后序遍历序列
  • 面试题34 二叉树中和为某一值的路径
  • 面试题36 二叉搜索树与双向链表
  • 面试题37 序列化二叉树
  • 面试题54 二叉搜索树的第k个结点
  • 面试题55.1 二叉树的深度
  • 面试题55.2 平衡二叉树

算法题目

查找

  • 面试题3.2 不修改数组找出重复的数字
  • 面试题11 旋转数组的最小数字
  • 面试题53.1 数字在排序数组中出现的次数
  • 面试题53.2 0~n-1中缺失的数字
  • 面试题57.1 数组中和为S的两个数字
  • 面试题57.2 数组中和为S的连续正数序列

排序

  • 面试题40 最小的k个数
  • 面试题51 数组中的逆序对

位运算

  • 面试题15 二进制中1的个数
  • 面试题56.1 数组中只出现一次的数字(两个)
  • 面试题56.2 数组中唯一只出现一次的数字
  • 面试题65 不用加减乘除做加法

回溯

  • 面试题12 矩阵中的路径
  • 面试题13 机器人的运动范围

分治

  • 面试题10.1 斐波那契数列
  • 面试题10.2 跳台阶
  • 面试题10.3 变态跳台阶
  • 面试题10.4 矩形覆盖
  • 面试题16 数值的整数次方
  • 面试题17 打印从1到最大的n位数
  • 面试题19 正则表达式匹配
  • 面试题43 从1到n整数中1出现的次数
  • 面试题44 数字序列中某一位的数字
  • 面试题46 把数字翻译成字符串
  • 面试题60 n个骰子的点数
  • 面试题64 求1+2+3+...+n

动态规划

  • 面试题14 剪绳子
  • 面试题47 礼物的最大价值
  • 面试题48 最长不含重复字符的子字符串
  • 面试题49 丑数

贪婪算法

  • 面试题14 剪绳子

算法

排序

  • 选择排序
  • 插入排序
  • 冒泡排序
  • 快速排序
  • 归并排序
  • 堆排序

查找

  • 二分查找
  • 哈希表查找
  • 搜索树查找

数据结构

数组

字符串

栈和队列

链表

  • 双向链表
  • 循环链表

二叉树

  • 二叉树的结构

  • 二叉树的遍历

    • 前、中、后序遍历
  • 二叉树的种类

    • 普通二叉树、完全二叉树、满二叉树

    • 二叉搜索树

      • 二叉平衡树

        • AVL树

        • 红黑树

          • 特性

            • 每个节点要么是红色的要么是黑色的
            • 根结点是黑色的,叶子结点是黑色的空结点
            • 一个结点是红色的,其子结点是黑色的
            • 对任意的结点,从该结点到其叶子结点构成的路径上的黑色结点数相同
          • 旋转和变色

            • 变色为了满足RB特性

            • 旋转

              • 左旋

                • 左旋的结点的左子结点成为其父结点的右子结点,而其父结点成为其左子结点,最后该结点移动到原父结点的位置
              • 右旋

                • 右旋的结点的右子结点成为其父结点的左子结点,而其父结点成为其右子结点,最后该结点移动到原父结点的位置
          • 插入

            • 父结点为黑

              • 不变
            • 父结点为红

              • 叔叔为红

                • 变色,最后以爷爷作为新的结点继续判定
              • 叔叔为黑

                • 父在左,叔在右,本身在左

                  • 父结点进行一次右旋转
                • 父在左,叔在右,本身在右

                  • 本身进行一次左旋转,左旋转后在父结点的位置再进行右旋转
                • 叔在左,父在右,本身在右

                  • 父结点进行一次左旋转
                • 叔在左,父在右,本身在左

                  • 本身进行一次右旋转,再进行左旋转
          • 删除(略)

        • AVL和红黑树的比较

          • AVL树是一棵严格的平衡树,它所有的子树都满足二叉平衡树的定义。因此AVL树高被严格控制在XXX,因此AVL树的查找比较高效。但AVL树插入、删除结点后旋转的次数比红黑树多。
          • 红黑树用非严格的平衡来降低插入删除时旋转的次数。
    • 哈夫曼树

      • F中选择权值最小的两个树(可以是单个节点)合并成一个树并放入F,再选择两个合并,重复直到F只有一棵树为止。

  • 图的结构

  • 图的遍历

    • DFS
    • BFS
  • 并查集

  • 最短路径

    • Dijkstra算法
    • Floyd算法
  • 最小生成树

    • Prim算法
    • Kruskal算法