算法
2021dragon
越努力越幸运
展开
-
【算法入门15】删除链表中重复的结点
核心考点:链表操作,临界条件检查,特殊情况处理在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。原创 2021-12-09 13:56:48 · 7057 阅读 · 24 评论 -
【算法入门14】二叉树的镜像
核心考点:二叉树操作操作给定的二叉树,将其变换为源二叉树的镜像。解析:要将一棵二叉树变化为自身的镜像,只需交换该二叉树每一个结点的左右子树即可。例如,上述二叉树我们交换根结点的左右子树后源二叉树会发生如下变化。再继续交换下一层结点的左右子树后,便可得到源二叉树镜像后的二叉树。但实际上我们还会交换叶子结点的左右子树,只不过叶子结点的左右子树都为空树交换后二叉树无变化。二叉树都是递归定义的,所以递归操作是比较常见的做法。/*struct TreeNode { int val; s原创 2021-11-09 13:38:03 · 3069 阅读 · 11 评论 -
【算法入门13】树的子结构
核心考点:二叉树理解,二叉树遍历输入两棵二叉树A, B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)原创 2021-11-07 11:39:48 · 1527 阅读 · 9 评论 -
【算法入门12】链表合并
核心考点:链表合并,思维缜密程度输入两个递增的链表,合并这两个链表并使新链表中的结点仍然是递增排序的。解析一:(常规)合并两个链表最常规的做法就是,依次比较两个链表的第一个结点,取较小的结点(此处为递增排序)尾插到一个新链表后,直到其中一个链表当中的结点被取完,最后将未取完结点的链表全部尾插到新链表后即可。动图演示:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(N原创 2021-10-24 09:26:17 · 7074 阅读 · 16 评论 -
【算法入门11】反转链表
核心考点:链表操作,思维缜密程度输入一个链表,反转链表后,输出新链表的表头。解析一:(三指针法)利用三个指针进行链表的反转:left,mid,right依次指向第一个结点,第二个结点和第三个结点。让mid指向的结点指向left。left,mid,right统一向右移动。反复指向步骤2和步骤3,直到right指向链表表尾,即nullptr。再让mid指向的结点指向left。最后让第一个结点指向空,即nullptr。注意: 当链表为空或链表当中只有一个结点时,链表无需反转。动图演示:原创 2021-10-16 17:01:38 · 874 阅读 · 6 评论 -
【算法入门10】链表中倒数第k个结点
核心考点:链表,前后指针的使用,边界条件检测输入一个链表,输出该链表中倒数第k个结点。解析一:(不提倡)一个比较容易想到的方法就是:先遍历一遍链表,统计出链表当中的结点总个数。然后计算出倒数第k个结点是从前往后的第几个结点。最后再遍历一遍链表,找到目标结点。该方法虽然能够解决问题,但是不提倡,因为该方法需要遍历两遍链表。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x),原创 2021-10-15 09:46:48 · 666 阅读 · 18 评论 -
【算法入门09】矩形覆盖
核心考点:场景转化成模型,特殊情况分析,简单dp我们可以用 2×12\times12×1 的小矩形横着或者竖着去覆盖更大的矩形。请问用n个 2×12\times12×1 的小矩形无重叠地覆盖一个 2×n2\times n2×n 的大矩形,总共有多少种覆盖的方法?例如,n=3时,2×32\times32×3 的矩形块有3种覆盖方法:...原创 2021-10-10 10:49:21 · 2021 阅读 · 17 评论 -
【算法入门08】青蛙跳台阶
核心考点:场景转化模型,模型提取解法,简单dp,fib一只青蛙一次可以跳上1级台阶,也可以跳上2级。求青蛙跳上一个n级的台阶共有多少种跳法(先后次序不同算不同的结果)。原创 2021-10-07 10:05:16 · 4723 阅读 · 45 评论 -
【算法入门07】斐波那契数列
核心考点:空间复杂度,fib理解,剪枝重复计算大家都知道斐波那契数列,现在要求输入一个正整数n,请你输出斐波那契数列的第n项。斐波那契数列是一个满足原创 2021-10-04 13:39:53 · 2337 阅读 · 19 评论 -
【算法入门06】重建二叉树
核心考点:二叉树重建,遍历理解,递归给定某二叉树的前序遍历和中序遍历,且前序遍历和中序遍历当中无重复元素,请重建出该二叉树并返回它的头结点。例如输入前序遍历序列{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历序列{4, 7, 2, 1, 5, 3, 8, 6},则重建出的二叉树如下图所示。解析:首先我们必须知道前序遍历和中序遍历的遍历顺序:前序遍历顺序:根 -> 左子树 -> 右子树中序遍历顺序:左子树 -> 根 -> 右子树据此我们可以知道,前序遍历序列原创 2021-09-10 09:52:39 · 664 阅读 · 5 评论 -
【算法入门05】从尾到头打印链表
核心考点:链表相关,多结构混合使用,递归输入一个链表的头结点,按链表从尾到头的顺序返回每个结点的值(用数组返回)。解析一:(不提倡)我们可以通过所给头结点依次遍历链表当中的结点,并将遍历到的结点值存放到数组当中,此时数组当中存放的便是按链表从头到尾的每个结点的值,然后我们将数组进行逆置便可以得到按链表从尾到头的每个结点的值。/*** struct ListNode {* int val;* struct ListNode *next;* List原创 2021-09-09 08:21:36 · 652 阅读 · 12 评论 -
【算法入门04】替换空格
核心考点:字符串相关,特性观察,临界条件处理请实现一个函数,将一个字符串中的每个空格替换成"%20"。例如,字符串We Are Happy经过替换之后的字符串为We%20Are%20Happy。解析:替换空格大致可分为以下三个步骤:1、遍历一遍字符串,统计字符串当中的空格数count。2、通过空格数count算出替换后字符串的新长度newlength。因为一个空格字符会被替换为三个字符,所以替换后字符串的新长度newlength = length + 2*count。3、从后向前对字符串进行填原创 2021-09-08 12:46:10 · 914 阅读 · 17 评论 -
【算法入门03】调整数组顺序使奇数位于偶数前面
核心考点:数组操作,排序思想的扩展使用输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。例如将数组{1, 2, 3, 4, 5, 6}调整为{1, 3, 5, 2, 4, 6}。解析一:(若相对位置可变)若是题目当中没有要求数组调整后奇数和奇数,偶数和偶数的相对位置不变,那么我们可以使用两个变量(left和right)来遍历数组,left从左往右寻找偶数,right从右往左寻找奇数,之原创 2021-09-07 15:19:56 · 1496 阅读 · 11 评论 -
【算法入门02】旋转数组的最小数字
核心考点:数组理解,二分查找,临界条件把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}是数组{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。NOTE:给出的所以元素都大于0,若数组大小为0,请返回0。解析一:(不提倡)寻找数组当中的最小值,不管怎么说,遍历一遍数组当中元素是肯定能找到的。class Solution {public: int minNumberInRo原创 2021-09-07 10:05:15 · 2353 阅读 · 12 评论 -
【算法入门01】二维数组中的查找
核心考点:数组相关、特性观察、时间复杂度把握在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样一个二维数组和一个整数,判断数组中是否含有该整数。解析一:(不提倡)这种在二维数组当中进行查找的问题,很多人的思路就是依次遍历二维数组当中的元素进行查找。class Solution {public: bool Find(int target, vector<vector<int> > ar原创 2021-09-06 12:37:52 · 2159 阅读 · 10 评论