LeetCode算法学习笔记
Xuannn_n
社畜
展开
-
【LeetCode算法学习笔记】Union-Find并查集算法详解
labuladong算法公众号学习笔记labuladong算法公众号学习笔记labuladong算法公众号学习笔记Union-Find并查集算法详解问题描述基本思路平衡性优化路径压缩完整代码问题描述Union-Find算法主要需要实现两个API:class UF{ //将p和q连接 public void union(int p, int q); //判断p和q是否连通 public boolean connected(int p, int q); //返原创 2021-01-31 23:02:24 · 269 阅读 · 0 评论 -
【LeetCode算法学习笔记】回文单链表判断
labuladong算法公众号学习笔记labuladong算法公众号学习笔记labuladong算法公众号学习笔记回文单链表判断判断回文单链表优化空间复杂度*寻找回文串的核心思想是从中心向两端扩展:*string palindrome(string& s, int l, int r){ while(l >= 0 && r<s.size() && s[l] == s[r]){ //向两边展开 l--;r++;原创 2021-01-28 17:16:08 · 187 阅读 · 0 评论 -
【LeetCode算法学习笔记】递归思维:k个一组反转链表
labuladong算法公众号学习笔记labuladong算法公众号学习笔记labuladong算法公众号学习笔记递归思维:k个一维反转链表分析问题代码实现分析问题链表是一种具有递归和迭代性质的数据结构。大致算法流程:1、先反转以head开头的k个元素。2、将第k+1个元素作为head递归调用reverseKGroup函数。3、将上述两个过程的结构连接起来。base case:如果最后的元素不足k个,就保持不变。代码实现ListNode reverse(ListNode a,List原创 2021-01-24 15:22:13 · 89 阅读 · 0 评论 -
【LeetCode算法学习笔记】递归反转链表
labuladong算法公众号学习笔记labuladong算法公众号学习笔记labuladong算法公众号学习笔记递归反转链表递归反转整个链表反转链表前N个节点反转链表的一部分总结单链表的结构://单链表节点的结构public class ListNode{ int val; ListNode nest; ListNode(int x) {val=x;}}递归反转整个链表实现代码如下:ListNode reverse(ListNode head){ if原创 2021-01-23 17:04:09 · 163 阅读 · 0 评论 -
【LeetCode算法学习笔记】二叉搜索树第三期
labuladong算法公众号学习笔记labuladong算法公众号学习笔记labuladong算法公众号学习笔记二叉搜索树第三期不同二叉搜索树不同二叉搜索树II如何计算所有合法BST不同二叉搜索树穷举法二叉树算法的关键在于明确根节点需要做什么int numTrees(int n){ //计算闭区间[1,n]组成的BST个数 return count(1,n);}/*计算闭区间[lo,hi]组成的BST个数*/int count(int lo,int hi){原创 2021-01-15 16:48:36 · 89 阅读 · 0 评论 -
【LeetCode算法学习笔记】双指针技巧(有更新)
双指针技巧一级目录二级目录三级目录一级目录二级目录三级目录原创 2020-11-26 20:31:07 · 117 阅读 · 0 评论 -
【LeetCode算法学习笔记】二叉搜索树第二期
labuladong算法学习笔记判断BST的合法性、增、删、改、查。二叉搜索树第二期BST的合法性搜索一个数BST的合法性重点:BST中,root的整个左子树都要小于root.val,整个右子树都要大于root.val。所以问题在于,怎么把root的约束传递给左右子树。boolean isValidBST(TreeNode root){ return isValidBST(root,null,null);}boolean isValidBST(TreeNode root,TreeNo原创 2020-11-19 15:54:27 · 339 阅读 · 0 评论 -
【LeetCode算法学习笔记】二叉搜索树第一期
labuladong算法公众号学习笔记BST的特性:1、对于每一个节点node,左子树的值都比node要小,右子树的值都比node要大。2、对于每一个节点node,它的左侧子树和右侧子树都是BST。3、BST的中序遍历结果是有序的(升序)。可以用一下代码将BST中每个节点的值升序打印出来:void traverse(TreeNode root){ if(root == null) return; traverse(root.left); //中序遍历代码位置 pr原创 2020-11-16 16:30:01 · 135 阅读 · 0 评论 -
【TSP问题】TSP问题有关解法
TSP问题有关解法近似算法贪心算法分支限界法TSP问题可以有很多种解决方法,比如动态规划、蛮力算法,贪心算法、近似算法、蚁群算法、遗传算法、分支限界法等等。之前课程作业也做过很多有关TSP问题的习题。所以想把这些都总结一下,方便以后作为复习。近似算法#include<iostream>#include<vector>#include<stack>using namespace std;class Graph{private: int n;//顶点个数原创 2020-11-11 19:44:51 · 18725 阅读 · 3 评论 -
【LeetCode算法学习笔记】最长公共子序列问题(动态规划)
算法题技巧是,把大问题细化到一个点,先研究在这个点上如何解决问题,然后再通过递归/迭代的方式扩展到整个问题。最长公共子序列问题最长公共子序列字符串的删除操作最小ASCII删除和最长公共子序列正确思路是不要考虑整个字符串,而是细化到s1和s2的每个字符。对于两个字符串求子序列的问题,都是用两个指针i和j分别在两个字符串上移动,是动态规划的思路。先写一个dp函数,这个dp函数的定义是:dp(s1,i,s2,j)计算s1[i…]和s2[j…]的最长公共子序列。然后,具体到每一个字符,思考每个字符该做什么原创 2020-10-29 13:51:44 · 161 阅读 · 1 评论 -
【LeetCode算法学习笔记】接雨水问题
labuladong公众号算法学习笔记接雨水问题暴力解法备忘录优化双指针解法就是用一个数组表示一个条形图,问这个条形图最多能接多少雨水。暴力解法核心思路:位置i能达到的水柱高度和其左边的最高柱字、右边的最高柱字有关。位置i的最大水柱高度为min(l_max,r_max)。water[i] = min( //左边最高的柱子 max(height[0...i], //右边最高的柱子 max(height[原创 2020-10-24 12:50:20 · 123 阅读 · 0 评论 -
【LeetCode算法学习笔记】区间相关问题
labuladong公众号算法学习笔记所谓区间问题就是线段问题,合并所有线段、找出线段的交集等。主要有两个技巧:1、排序2、画图区间相关问题区间覆盖问题区间覆盖问题可以先算一下,被覆盖区间有多少个,然后和总数相减局势剩余区间数。区间问题可以首先进行排序,按照区间的起点进行升序排序。可以分为三种情况:情况1、有覆盖区间;情况2、两个区间可以合并成为一个大区间;情况3、两个区间完全不相交。...原创 2020-10-21 13:18:21 · 220 阅读 · 0 评论 -
【LeetCode算法学习笔记】单调栈解题模板
labuladong学习笔记单调栈解题模板单调栈模板问题变形处理环形数组单调栈模板vector<int> nextGreaterElement(vector<int>& nums){ vector<int> res(nums.size());//存放答案的数组 stack<int> s; //倒着往栈里放 for(int i = nums.size()-1; i >= 0;i--){ //判断原创 2020-10-19 19:11:53 · 161 阅读 · 0 评论 -
【LeetCode算法学习笔记】二叉树的最近祖先
二叉树的最近祖先题目解法思路定义状态选择题目与树相关,考虑一下递归二叉树的套路框架:void traverse(TreeNode root){ //前序遍历 traverse(root.left); //中序遍历 traverse(root.right); //后序遍历}先把框架写出来:TreeNode lowestCommonAncestor(TreeNode root,TreeNode p,TreeNode q){ TreeNode lef原创 2020-10-18 20:39:22 · 100 阅读 · 0 评论 -
【LeetCode算法学习笔记】完全二叉树的节点数
完全二叉树满二叉树和完全二叉树思路普通二叉树满二叉树完全二叉树满二叉树和完全二叉树完全二叉树:每一层都是紧凑靠左完全二叉树:每层都是满的思路普通二叉树public int countNodes(TreeNode root){ if(root == null) return 0; return 1 + countNodes(root.left) + countNodes(root.right);}满二叉树public int countNodes(TreeNode root原创 2020-10-16 13:24:46 · 73 阅读 · 0 评论 -
【LeetCode算法学习笔记】序列化和反序列化二叉树
labuladong公众号算法学习笔记序列化和反序列化二叉树前序遍历解法serializedeserialize序列化就是把结构化的数据打平,考察二叉树的遍历方式。前序遍历解法serialize在递归遍历两颗子树之前写的代码就是前序遍历代码。String SEP=",";String NULL="#";String serialize(TreeNode root){ StringBuilder sb = new StringBuilder(); serialize(root,原创 2020-10-14 14:20:50 · 227 阅读 · 0 评论 -
【LeetCode算法学习笔记】二叉树 第三期
labuladong算法公众号学习笔记根据题意,思考一个二叉树节点需要做什么,到底用什么遍历就清楚了二叉树框架void traverse(TreeNode root){ //前序遍历 traverse(root.left); //中序遍历 traverse(root.right); //后序遍历}二叉树 第三期节点应该做什么如何知道自己的子树知道别的树长什么样节点应该做什么以自己为根的二叉树(子树)是什么样子以其他节点为根的子树的样子如何知原创 2020-10-13 18:50:26 · 149 阅读 · 0 评论 -
【LeetCode算法学习笔记】数组去重题(难)
labuladong算法公众号学习笔记LeetCode316 去除重复字母去重题题目思考思路先用栈实现前两个要求题目思考有三点要求:要去重不能打乱s中字符出现的相对顺序字典序最小(比如“abc”的字典序就比“bac”的字典序小)思路先用栈实现前两个要求String removeDuplicateLetters(String s){ //存放去重结果 Stack<Character> stk = new Stack<>(); //布尔数原创 2020-10-12 17:15:20 · 159 阅读 · 0 评论 -
【LeetCode算法学习笔记】LFU算法
labuladong公众号算法学习笔记LFU算法算法描述思路分析代码框架LFU核心逻辑LRU算法 相当于把数据按照时间排序,这个需要借助链表很自然就能实现,如果一直从链表头部加入元素,越靠近头部的元素就是新数据,越靠近尾部就是旧数据,只要简单把尾部元素淘汰掉即可。LFU算法 相当于是淘汰访问频次最低的数据。如果访问频次最低的数据有多条,需要淘汰最旧的数据。把数据按照访问频次进行排序,频次还会不断变化。算法描述class LFUCache{ //构造容量为capacity的缓存 pu原创 2020-10-09 14:04:31 · 265 阅读 · 0 评论 -
【LeetCode算法学习笔记】LRU算法
LRU和LFU算法LRU算法LFU算法LRU算法LFU算法原创 2020-10-08 11:53:18 · 260 阅读 · 0 评论 -
【LeetCode算法学习笔记】查找、删除数组中任意元素
labuladong公众号算法学习笔记查找、删除数组中任意元素实现随机集合避开黑名单的随机数总结实现随机集合对于getRandom方法,如果想要[等概率]和[在O(1)的时间]取出元素就一定要满足:底层用数组实现,且数组必须是紧凑的。对数组尾部进行插入和删除操作不会涉及数据搬移,时间复杂度为O(1),可以先把元素val交换到数组的尾部,然后pop出去。交换两个元素需要索引来进行,则需要哈希表ValToIndex来记录每个元素值对应的索引。class RandomizedSet{ public:原创 2020-10-07 14:59:50 · 145 阅读 · 0 评论 -
【LeetCode算法学习笔记】双指针技巧数组题
labuladong公众号算法学习笔记双指针技巧数组题有序数组、链表查重移除元素移动零有序数组、链表查重LeetCode第26题原地修改的意思就是在原有数组上进行操作,不再重新new一个数组出来。在原数组上操作,然后返回一个长度,这样就可以得到去重后的元素有哪些。可以采用“快慢指针”的技巧。int removeDuplicates(int[] nums){ if(nums.length==0) return 0; int fast=0,slow=0; while(fas原创 2020-10-06 20:55:53 · 101 阅读 · 0 评论 -
【LeetCode算法学习笔记】股票买卖问题
labuladong算法公众号个人学习笔记股票买卖问题穷举框架状态转移框架题目121122309714123188用“状态机”的技巧来解决问题,即DP table。穷举框架利用[状态]进行穷举,看看总共有几种可能的[状态],再找出每个[状态]对应的[选择]。每天有三种选择:买入,卖出,无操作。有三个状态:天数,允许交易的最大次数,当前持有的状态。for 0<=i<=n://n为天数 for 0<=k<=K: //K为最多交易次数 for原创 2020-09-28 20:33:03 · 177 阅读 · 0 评论 -
【LeetCode算法学习笔记】双指针技巧汇总
双指针技巧汇总快慢指针的常见算法判定链表中是否含有环已知链表有环,返回环的起点寻找链表的中点寻找链表的倒数k个元素左右指针的常用算法二分查找两数之和反转数组滑动窗口算法快慢指针的常见算法主要解决链表问题,快慢指针初始化都在链表的头结点head,前进时指针fast在前,慢指针slow在后。判定链表中是否含有环若链表中不含有环,则指针最终会遇到空指针Null表示链表到头。若含有环,经典解法就是用两个指针,一个每次前进两步,一个每次前进一步。如果不含有环,则跑得快的那个最终会遇到null;如果含有环,快原创 2020-09-26 19:15:00 · 110 阅读 · 0 评论 -
【LeetCode算法学习笔记】二分查找详解
个人学习笔记逻辑最基本二分查找法初始化 right = nums.length - 1搜索区间是 [left , right]所以决定了while ( left <= right)也决定了 left = mid + 1 和 right = mid - 1只需要 target 的索引即可所以当 nums[mid] == target时可以立即返回寻找左侧边界的二分查找初始化 right = nums.length搜索区间[left , right)所以决定了while (left原创 2020-09-24 23:31:33 · 134 阅读 · 0 评论 -
【LeetCode算法学习笔记】二叉树框架
学习笔记,总结labuladong公众号文章,方便自己以后更好的理解和学习!!!是个人的学习笔记记录,是个人的学习笔记记录,是个人的学习笔记记录。强烈推荐labuladong公众号进行学习二叉树框架前/中/后序遍历框架层级遍历框架前/中/后序遍历框架void traverse(TreeNode root){ if(root==null) return; //前序遍历 traverse(root.left); //中序比那里 traverse(root.rig原创 2020-09-22 19:53:24 · 220 阅读 · 0 评论 -
【LeetCode算法学习笔记】二叉树 第二期
学习笔记,总结labuladong公众号文章,方便自己以后更好的理解和学习!!!是个人的学习笔记记录,是个人的学习笔记记录,是个人的学习笔记记录。强烈推荐labuladong公众号进行学习二叉树 第二期构造最大二叉树(654)通过前序遍历和后序遍历构造二叉树(105)通过后序和中序遍历关键思路:先把题目的要求细化,搞清楚根节点应该做什么,然后剩下的事情抛给前/中/后序的遍历框架就可以了。构造最大二叉树(654)首先找到最大值,然后套用框架。public TreeNode constructMa原创 2020-09-22 19:45:29 · 262 阅读 · 0 评论 -
【LeetCode算法学习笔记】BFS算法框架
个人学习笔记,记录以便后续复习个人学习笔记,记录以便后续复习个人学习笔记,记录以便后续复习BFS算法框架算法框架二叉树的最小高度(111)解开密码锁密码的最小次数(752)双向BFS优化BFS核心思想就是把一些问题抽象成图,从一个点开始,向四周扩散。算法框架BFS问题的本质就是在一幅【图】中找到从起点start到终点target的最近距离。框架如下://计算从起点start到终点target的最近距离int BFS(Node start,Node target){ Queue<原创 2020-09-21 20:36:21 · 292 阅读 · 0 评论 -
【LeetCode算法学习笔记】二叉树 第一期
学习笔记,总结labuladong公众号文章,方便自己以后更好的理解和学习!!!是个人的学习笔记记录,是个人的学习笔记记录,是个人的学习笔记记录。强烈推荐labuladong公众号进行学习二叉树 第一期重要性如何写递归题目翻转二叉树(226)填充二叉树节点的右侧指针(116)二叉树展开为链表(114)**二叉树遍历框架:**void traverse(TreeNode root){ //前序遍历 traverse(root.left); //中序遍历 travers原创 2020-09-19 14:08:25 · 191 阅读 · 0 评论