刷题总结(LeetCode,面经,剑指offer)


Java JavaScript 输入输出

Java 集合用法

链接
Java ArrayList和Array常用方法
Java String常用方法
Java Stack,Queue,PriorityQueue,deque相关操作
Java Map的常用方法
Java Set详解

数组

系列 链接 备注
剑指offer 剑指offer系列——1.二维数组中的查找
剑指offer 剑指offer系列——13.调整数组顺序使奇数位于偶数前面
剑指offer 剑指offer系列——19.顺时针打印矩阵
剑指offer 剑指offer系列——28.数组中出现次数超过一半的数字
剑指offer 剑指offer系列——30.连续子数组的最大和 动态规划(更好)或分治法(太复杂)
剑指offer 剑指offer系列——32.把数组排成最小的数
剑指offer 剑指offer系列——45.扑克牌顺子
剑指offer 剑指offer系列——50.数组中重复的数字 *
剑指offer 剑指offer系列——51.构建乘积数组
LeetCode LeetCode——分发糖果
LeetCode LeetCode——加油站
LeetCode LeetCode——最长连续序列
LeetCode LeetCode——字母异位词分组
LeetCode LeetCode——缺失的第一个正数
LeetCode LeetCode——寻找两个有序数组的中位数
LeetCode LeetCode——第三大的数
LeetCode LeetCode——使数组唯一的最小增量 hash冲突的线性探测,路径压缩
LeetCode LeetCode——三维形体的表面积
LeetCode LeetCode——最接近的三数之和
LeetCode LeetCode——和等于 k 的最长子数组长度

链表

找链表的中点:

    ListNode slow = head;
    ListNode fast = head.next;
    while (fast != null && fast.next != null) {
        slow = slow.next;
        fast = fast.next.next;
    }
    return slow;
系列 链接 备注
剑指offer 剑指offer系列——3.从尾到头打印链表
剑指offer 剑指offer系列——14.链表中倒数第k个结点 典型双指针问题
剑指offer 剑指offer系列——15.反转链表 *这个是个更典型的递归问题。
剑指offer 剑指offer系列——16.合并两个排序的链表
剑指offer 剑指offer系列——25.复杂链表的复制
剑指offer 剑指offer系列——36.两个链表的第一个公共结点
剑指offer 剑指offer系列——55.链表中环的入口结点
剑指offer 剑指offer系列——56.删除链表中重复的结点
LeetCode LeetCode——排序链表
LeetCode LeetCode——对链表进行插入排序
LeetCode LeetCode——重排链表
LeetCode LeetCode——两两交换链表中的节点
LeetCode LeetCode——两数相加
LeetCode LeetCode——回文链表 重点:reverse

二叉树

系列 链接 备注
总结 LeetCode——二叉树遍历 *
总结 LeetCode——N叉树的遍历
剑指offer 剑指offer系列——4.重建二叉树(前序中序确定树/中序后序确定树) *
剑指offer 剑指offer系列——17.树的子结构
剑指offer 剑指offer系列——18.二叉树的镜像
剑指offer 剑指offer系列——22.从上往下打印二叉树
剑指offer 剑指offer系列——23.二叉搜索树的后序遍历序列
剑指offer 剑指offer系列——26.二叉搜索树与双向链表 *
剑指offer 剑指offer系列——24.二叉树中和为某一值的路径
剑指offer 剑指offer系列——38.二叉树的深度
剑指offer 剑指offer系列——39.平衡二叉树
剑指offer 剑指offer系列——57.二叉树的下一个结点 *
剑指offer 剑指offer系列——58.对称的二叉树
剑指offer 剑指offer系列——59.按之字形顺序打印二叉树
60.把二叉树打印成多行
剑指offer 剑指offer系列——61.序列化二叉树 *
LeetCode LeetCode——序列化和反序列化 N 叉树
剑指offer 剑指offer系列——62.二叉搜索树的第k个结点
LeetCode Leetcode——二叉树的最小深度
LeetCode LeetCode——二叉树中的最大路径和
LeetCode LeetCode——填充每个节点的下一个右侧节点指针
LeetCode LeetCode——排序数组/链表转平衡二叉搜索树
LeetCode LeetCode——验证二叉查找树
LeetCode LeetCode——二叉树的最近公共祖先
LeetCode LeetCode——删除二叉搜索树中的节点
LeetCode LeetCode——二叉树的右视图
LeetCode LeetCode——将二叉搜索树变平衡 中序+排序数组/链表转平衡二叉搜索树
LeetCode LeetCode——修剪二叉搜索树
LeetCode LeetCode——不同的二叉搜索树 II
LeetCode LeetCode——二叉树的直径
LeetCode LeetCode——拆分二叉搜索树
LeetCode LeetCode——最大二叉树
LeetCode LeetCode——二叉搜索树中的顺序后继/前驱
LeetCode——二叉搜索树中的中序后继 II

动态规划

系列 链接 备注
总结 0-1背包问题总结
剑指offer 剑指offer系列——7.斐波拉契数列 实际上用动态规划解决斐波拉契会更好
剑指offer 剑指offer系列——30.连续子数组的最大和
剑指offer 剑指offer系列——52.正则表达式匹配 *
LeetCode LeetCode——单词拆分 01背包问题(True、False问题)
LeetCode LeetCode——分割回文串II *
LeetCode LeetCode——买卖股票的最佳时机 *
LeetCode LeetCode——杨辉三角 i-ii
LeetCode LeetCode——三角形最小路径和
LeetCode LeetCode——不同的子序列
LeetCode LeetCode——不同的子序列 II ?
LeetCode LeetCode——交错字符串
LeetCode LeetCode——解码方法
LeetCode LeetCode——最小路径和
LeetCode LeetCode——编辑距离
LeetCode LeetCode——二维矩阵最大正方形面积
LeetCode LeetCode——无重复字符的最长子串 滑动窗口也可以
LeetCode LeetCode——零钱兑换 01背包问题(最大最小问题)
LeetCode LeetCode——零钱兑换 II 完全背包问题(组合问题,不考虑顺序)
LeetCode LeetCode——高层扔鸡蛋 *
LeetCode LeetCode——最长回文子序列 *
LeetCode LeetCode——删除回文子数组 *
LeetCode LeetCode——石子游戏 博弈问题
LeetCode LeetCode——打家劫舍问题
面试金典 面试金典——按摩师
LeetCode LeetCode——四键键盘
LeetCode LeetCode——接雨水问题 *
LeetCode LeetCode——最大矩形 *
LeetCode LeetCode——跳跃游戏 I-II
LeetCode LeetCode——最长回文子串 *
LeetCode LeetCode——戳气球
LeetCode LeetCode——分割等和子集 01背包问题(True、False问题)
LeetCode LeetCode——组合总和 Ⅳ 完全背包问题(组合问题,考虑顺序)
LeetCode LeetCode——一和零 01背包问题(最大最小问题)
LeetCode LeetCode——目标和 0-1背包问题(组合问题)

字符串

系列 链接 备注
剑指offer 剑指offer系列——2.替换空格
剑指offer 剑指offer系列——34.第一个只出现一次的字符
剑指offer 剑指offer系列——43.左旋转字符串 典型两次翻转
剑指offer 剑指offer系列——44.翻转单词顺序列/翻转字符串里的单词
剑指offer 剑指offer系列——49.把字符串转换成整数
剑指offer 剑指offer系列——53.表示数值的字符串
LeetCode LeetCode——验证回文串
LeetCode LeetCode——最长公共前缀 1.分治法 2.字典树
LeetCode LeetCode——简化路径
面试金典 面试金典——模式匹配
LeetCode LeetCode——设计搜索自动补全系统 也可以用字典树
LeetCode LeetCode——统计重复个数
面试金典 面试金典——字符串压缩
LeetCode LeetCode——删除字符串中的所有相邻重复项 II
LeetCode LeetCode——字符串相乘
LeetCode LeetCode——判断子序列
LeetCode LeetCode——回文子串

图(DFS,BFS,回溯)

系列 链接 备注
总结 LeetCode刷题之BFS和DFS *
剑指offer 剑指offer系列——27.字符串的排序(全排序) 回溯
剑指offer 剑指offer系列——65.矩阵中的路径
剑指offer 剑指offer系列——66.机器人的运动范围
LeetCode LeetCode——单词拆分 ii *
LeetCode LeetCode——克隆图
LeetCode LeetCode——分割回文串 *
LeetCode LeetCode——被围绕的区域
LeetCode LeetCode——求根到叶子节点数字之和
LeetCode LeetCode——单词接龙 *
LeetCode LeetCode——单词接龙 II DFS结合BFS*
LeetCode LeetCode——子集 i-ii
LeetCode LeetCode——不同路径 i-ii
LeetCode LeetCode——网络延迟时间 Dijkstra/Floyd/SPFA/Bellman-ford算法*
LeetCode LeetCode——岛屿数量 DFS和BFS两种方法
LeetCode LeetCode——迷宫 i-ii DFS和BFS两种方法
LeetCode LeetCode——N皇后 *
LeetCode LeetCode——N皇后 II +bitmap回溯
LeetCode LeetCode——覆盖
LeetCode LeetCode——24 点游戏
LeetCode LeetCode——字典序排数
LeetCode LeetCode——字典序的第K小数字 DFS剪枝,非典型DFS
LeetCode LeetCode——复原IP地址
LeetCode LeetCode——课程表 i-ii 拓扑排序,DFS/BFS
LeetCode LeetCode——课程安排 IV Floyd/打表法,DFS/BFS
LeetCode LeetCode——矩阵中的最长递增路径 记忆深度搜索 / 拓扑排序BFS
LeetCode LeetCode——最低成本联通所有城市 最小生成树,kruskal 算法 和 Prim算法
LeetCode LeetCode——滑动谜题 BFS,A*搜索算法
LeetCode LeetCode——打开转盘锁 BFS 与 双向BFS
LeetCode LeetCode——重新安排行程 欧拉回路,Hierholzer算法

递归

系列 链接 备注
剑指offer 剑指offer系列——7.斐波拉契数列
剑指offer 剑指offer系列——8.跳台阶 9.变态跳台阶
剑指offer 剑指offer系列——10.矩阵覆盖
剑指offer 剑指offer系列——15.反转链表 *
LeetCode LeetCode——字符串解码 递归或栈

栈,队列

系列 链接 备注
剑指offer 剑指offer系列——5.用两个栈实现队列/一个队列实现栈 *
剑指offer 剑指offer系列——20.包含min函数的栈
剑指offer 剑指offer系列——21.栈的压入、弹出系列
剑指offer 剑指offer系列——54.字符流中第一个不重复的字符
剑指offer 剑指offer系列——63.数据流中的中位数
剑指offer 剑指offer系列——64.滑动窗口的最大值
LeetCode LeetCode——逆波兰表达式求值 后缀表达式
LeetCode LeetCode——每日温度 单调栈
LeetCode LeetCode——柱状图中最大的矩形 单调栈*
LeetCode LeetCode——最长有效括号
LeetCode LeetCode——不同字符的最小子序列/去除重复字母

位运算/数学问题

组合\(C_n^m\)

    public static long combination(int m, long n) {
        if (m == n)
            return 1;
        if (m == 0)
            return 1;
        return combination(m, n - 1) + combination(m - 1, n - 1);
    }
系列 链接 备注
剑指offer 剑指offer系列——11.二进制中1的个数 *
剑指offer 剑指offer系列——12.数值的整数次方 尤其是快速幂和快速乘的复习*
剑指offer 剑指offer系列——31.整数中1出现的次数 *
剑指offer 剑指offer系列——33.丑数
剑指offer 剑指offer系列——40.数组中只出现一次的数字
剑指offer 剑指offer系列——47.求1+2+……+n *
剑指offer 剑指offer系列——48.不用加减乘除做加法*
剑指offer 剑指offer系列——67.剪绳子
LeetCode LeetCode——直线上最多的点数
LeetCode LeetCode——格雷码
LeetCode LeetCode——阶乘后的零
LeetCode LeetCode——整数反转
面试金典 面试金典——交点
LeetCode LeetCode——矩形重叠
LeetCode LeetCode——数字转换为十六进制数 *
LeetCode LeetCode——最大单词长度乘积
LeetCode LeetCode——最小移动次数使数组元素相等
LeetCode LeetCode——每个元音包含偶数次的最长子字符串 *
LeetCode LeetCode——计数质数

双指针/滑动窗口

滑动窗口算法,应先增大窗口,再缩小窗口,再对窗口内部进行处理。

int left=0,right = 0;
while(right<s.length){
    window.add(s[right]);
    right++;
    while(left <= right && 超出条件){
        window.remove(s[left]);
        left++;
    }
    if(满足条件){
        window处理
    }
}
系列 链接 备注
剑指offer 剑指offer系列——14.链表中倒数第k个结点
剑指offer 剑指offer系列——41.和为S的连续正数序列
剑指offer 剑指offer系列——42.和为S的两个数字
LeetCode LeetCode——无重复字符的最长子串 动态规划也可以
LeetCode LeetCode——最小覆盖子串 *
LeetCode LeetCode——字符串的排列/找到字符串中所有字母异位词 *
LeetCode LeetCode——滑动窗口中位数 中位数参考:数据流中的中位数
LeetCode LeetCode——至多包含 K 个不同字符的最长子串

排序/区间合并

系列 链接 备注
总结 排序算法汇总 *
剑指offer 剑指offer系列——27.字符串的排序(全排序) 字典排序
剑指offer 剑指offer系列——29.最小的K个数
LeetCode LeetCode——分类颜色 计数排序
LeetCode LeetCode——最大间距 桶排序、基数排序*
LeetCode LeetCode——无重叠区间 区间调度问题,贪心算法
LeetCode LeetCode——用最少数量的箭引爆气球 贪心算法
LeetCode LeetCode——煎饼排序
LeetCode LeetCode——插入区间
LeetCode LeetCode——合并K个升序链表 堆排序
LeetCode LeetCode——合并区间
LeetCode LeetCode——区间交集
LeetCode LeetCode——俄罗斯套娃信封问题
LeetCode LeetCode——递增的三元子序列
LeetCode LeetCode——删除被覆盖区间

二分法/分治法(归并)

二分公式:
1、分析二分查找代码时,不要出现 else,全部展开成 else if 方便理解。
2、注意「搜索区间」和 while 的终止条件,如果存在漏掉的元素,记得在最后检查。
3、如需定义左闭右开的「搜索区间」搜索左右边界,只要在nums[mid] == target时做修改即可,搜索右侧时需要减一。
4、如果将「搜索区间」全都统一成两端都闭,好记,只要稍改nums[mid] == target条件处的代码和返回的逻辑即可.

int binary_search(int[] nums, int target) {
    int left = 0, right = nums.length - 1; 
    while(left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] < target) {
            left = mid + 1;
        } else if (nums[mid] > target) {
            right = mid - 1; 
        } else if(nums[mid] == target) {
            // 直接返回
            return mid;
        }
    }
    // 直接返回
    return -1;
}

int left_bound(int[] nums, int target) {
    int left = 0, right = nums.length - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] < target) {
            left = mid + 1;
        } else if (nums[mid] > target) {
            right = mid - 1;
        } else if (nums[mid] == target) {
            // 别返回,锁定左侧边界
            right = mid - 1;
        }
    }
    // 最后要检查 left 越界的情况
    if (left >= nums.length || nums[left] != target)
        return -1;
    return left;
}


int right_bound(int[] nums, int target) {
    int left = 0, right = nums.length - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] < target) {
            left = mid + 1;
        } else if (nums[mid] > target) {
            right = mid - 1;
        } else if (nums[mid] == target) {
            // 别返回,锁定右侧边界
            left = mid + 1;
        }
    }
    // 最后要检查 right 越界的情况
    if (right < 0 || nums[right] != target)
        return -1;
    return right;
}
系列 链接 备注
剑指offer 剑指offer系列——6.旋转数组的最小数字/搜索旋转排序数组 *
剑指offer 剑指offer系列——35.数组中的逆序对 *
剑指offer 剑指offer系列——37.数字在排序数组中出现的次数
LeetCode——在排序数组中查找元素的第一个和最后一个位置
典型二分查找*
LeetCode LeetCode——计算右侧小于当前元素的个数 分治法
LeetCode LeetCode——搜索插入位置
LeetCode LeetCode——最长上升子序列/最长递增子序列的个数 *也可以动态规划
LeetCode LeetCode——分割数组的最大值 也可以动态规划
LeetCode LeetCode——x 的平方根/有效的完全平方数 二分法,递推法,牛顿法

特殊结构或算法

系列 链接 备注
总结 LeetCode——多线程问题汇总 *
剑指offer 剑指offer系列——46.孩子们的游戏(圆圈中最后剩下的数) 约瑟夫环
LeetCode LeetCode——LRU Cache *LRU
LeetCode LeetCode——Nim游戏
LeetCode LeetCode——实现 strStr() KMP算法*
LeetCode LeetCode——实现Trie 字典树
LeetCode LeetCode——朋友圈 并查集
LeetCode LeetCode——冗余连接/以图判树 并查集
LeetCode LeetCode——区域和检索-数组可修改 线段树
LeetCode LeetCode——电灯开关
LeetCode LeetCode——最长重复子串 Rabin-Karp 字符串编码
LeetCode LeetCode——覆盖 匈牙利算法
LeetCode LeetCode——打乱数组 洗牌算法
LeetCode LeetCode——链表随机节点/随机数索引 蓄水池算法
LeetCode LeetCode——哲学家进餐问题 经典信号量问题
LeetCode LeetCode——不同的二叉搜索树 卡特兰数
LeetCode LeetCode——找到小镇的法官 七桥问题
LeetCode LeetCode——常数时间插入、删除和获取随机元素

Kickstart

类型 链接 备注
课程 Kick Start 2018 - Round A
课程 Kick Start 2018 - Round B
课程 Kick Start 2018 - Round C
课程 Kick Start 2018 - Round D
课程 Kick Start 2018 - Round E
课程 Kick Start 2018 - Round F
课程 Kick Start 2018 - Round G
课程 Kick Start 2018 - Round H
课程 Kick Start 2019 - Round C
posted @ 2020-04-20 16:10  Shaw_喆宇  阅读(1252)  评论(0编辑  收藏  举报