
LeetCode
_好好学习
这个作者很懒,什么都没留下…
展开
-
数据结构与算法——并查集(Union-Find)
1. 原理/概念并查集(Union-Find)主要用来解决无向图的【动态连通性】问题,对于无向图的连通,一般具有如下几个性质:自反性:节点p和 p 是连通的; 对称性:如果节点 p 和节点 q 连通,那么节点 q 和 p 也是连通的; 传递性:如果节点 p 和 q 连通, q 和 r 连通,那么 p 和 r 连通。本文参考一个大神labuladong的算法小抄:Union-Find算法详解,主页在这。注意,并查集只能用来解决无向图的连通性的问题,如果是有向图,要找其强连通分量,需要用t..原创 2020-09-03 10:44:37 · 640 阅读 · 0 评论 -
剑指 Offer(39):数组中出现次数超过一半的数字
1. 题目描述2. 题目理解方法1:哈希表记录元素出现次数最直观,最容易想到的,就是记录数组中每个元素的个数,使用哈希表(unordered_map)来记录数组中不同元素出现的次数。然后出现次数大于数组长度一半的那个元素就是要找的元素了。这个思路实现起来比较简单,时间复杂度O(n),空间复杂度O(n)。方法2:基于快排的思想快排每轮定位一个元素的位置,然后通过该元素的位置与数组中间位置进行比较,决定下一轮快排的区间。直到定位的那个元素刚好落在数组的中间位置。方法3:摩尔投票数原创 2020-08-24 11:10:23 · 230 阅读 · 0 评论 -
剑指offer(47):礼物的最大价值
1. 题目描述2. 题目理解典型的动态规划问题,直接看状态数组的定义:状态数组:dp[i][j]表示从起始位置到(i,j)能获得的最大的价值。状态转移方程:dp[i][j] = grid[i][j] + max( dp[i-1][j], dp[i][j-1] )就是,在当前grid[i][j]所能获得的最大价值=上一个位置所能获得的最大价值+当前位置的价值,其中上一个位置可以是在当前位置的正上方,也可以是当前位置的左边。base case:就是在矩阵的最上一条边和最...原创 2020-08-23 15:11:46 · 131 阅读 · 0 评论 -
剑指offer(46):把数字翻译成字符串
1. 题目描述2. 题目理解最先想到的可能是递归,从第一个数字开始翻译,然后判断前两个数字能不能合并一起翻译,然后一直递归下去。用递归的话势必会存在重叠子问题,存在重叠子问题的话,可以用备忘录来进行剪枝。递归从最大的问题开始自上而下解决问题,我们也可以从最小的子问题开始自下而上解决问题了,这样可以消除重复问题。重叠子问题想到动态规划,是一个比较顺的思路了,我们从最小的子问题开始,就是从num的最后,对应的是dp[len-1]。动态规划,状态数组定义:dp[i]表示从num[i]到结尾原创 2020-08-23 14:58:37 · 180 阅读 · 0 评论 -
LeetCode(46):全排列
1. 题目描述2. 题目理解看到这道题,就是典型的“回溯”问题,可以使用回溯算法来解决。回溯也是递归的过程,这里写了一下回溯算法的简单框架://回溯算法的框架void backTrack(最终结果(res),子结果(subRes),选择列表){ if(满足结束条件)结果中新增该项; for(遍历选择列表){ if(该项选择已经被包含在subRes中)continue; 将该选择项包含在子结果中; backTrac原创 2020-05-29 12:22:26 · 286 阅读 · 0 评论 -
LeetCode(204):计算质数
1. 题目描述2. 题目理解题目看着很简单,最先想到的就是做一个判断是不是质数的函数(isPrim),然后对n以内的正整数做个遍历,判断是质数的话,计数器count++,最傻瓜的代码如下:int isPrime(int n);//该函数用来判断传入参数是不是质数,是:返回1;不是:返回0int countPrimes(int n){ int cnt=0; for(int i=1;i<n;i++){ if(isPrime(i))cnt++; }原创 2020-05-26 10:02:59 · 709 阅读 · 0 评论 -
LeetCode(105):从前序与中序遍历序列构造二叉树
1. 题目描述2. 题目理解前序遍历数组的首元素一定是当前子树的根节点。根据这一性质,找到当前子树的根节点,然后查找该节点在中序遍历数组中的位置,可以得到当前根节点左子树中元素的个数。将中序遍历按照根节点分为左右两部分,对应左右子树的中序遍历;同时将前序遍历按照根节点以及根节点左子树中元素的个数,也分成左右两部分,对应左右子树的前序遍历。按照以上思路,用递归的方式可以构造出整个树。3. 代码3.1 C语言代码/** * Definition for a binary tree原创 2020-05-25 11:16:05 · 186 阅读 · 0 评论 -
LeetCode(199):二叉树的右视图
参考链接:LeetCode官方题解1. 题目描述如图所示。2层序遍历/广度优先搜索(BFS)2.1 基本思路这个题最先想到的就是用二叉树的层序遍历,层序遍历中每一层最后访问到的就是该层最右边的节点,也就是从右侧看到的该层的值。层序遍历跟前序、中序、后序遍历,都是二叉树的基本遍历方法。树的层序遍历,可以用广度优先搜索(Breadth First Search, BFS)...原创 2020-05-05 14:33:52 · 218 阅读 · 0 评论 -
LeetCode(1248):统计【优美子数组】
1. 题目描述如图所示:2. 题目理解看到这个“子数组”的概念,首先会想到,如果数组中存在优美子数组,那么会有很多“子数组”都是由一些最基本的“子数组”派生而来的,这些最基本的“子数组”,应该是包含k个奇数,并且元素数目最少的那些数组,不妨记为Si。则从Si可以向前或者向后包含序列中的偶数(如果存在),进而派生出其他的“子数组”。有了这个思路之后,就明确了基本方向:先找数组...原创 2020-05-04 21:33:18 · 313 阅读 · 0 评论