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


Java JavaScript 输入输出

Java 集合用法

数组

链表

找链表的中点:

    ListNode slow = head;
    ListNode fast = head.next;
    while (fast != null && fast.next != null) {
        slow = slow.next;
        fast = fast.next.next;
    }
    return slow;

二叉树

系列 链接 备注
总结 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背包问题(组合问题)

字符串

图(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算法

递归

栈,队列

位运算/数学问题

组合Cnm

    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);
    }

双指针/滑动窗口

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

int left=0,right = 0;
while(right<s.length){
    window.add(s[right]);
    right++;
    while(left <= right && 超出条件){
        window.remove(s[left]);
        left++;
    }
    if(满足条件){
        window处理
    }
}

排序/区间合并

二分法/分治法(归并)

二分公式:
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;
}

特殊结构或算法

Kickstart

posted @   Shaw_喆宇  阅读(1271)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示