刷题
幽萌之雨
上班族
展开
-
最长公共子序列求解
求最长公共子序列递归求解//X = { x1,x2,x3,.....xm } m//Y = { y1,y2,y3,.....yn } n//Z = { z1,z2,z3,....zk } k//假设一:xm == yn;// xm == yn == zk;// Zk - 1 = Xm - 1 && Yn - 1;//假设二:xm != yn// zk != yn// Zk = Xm && Yn - 1;//假设三:xm原创 2021-09-29 19:12:03 · 109 阅读 · 0 评论 -
二叉树的镜像
题目:请完成一个函数,请函数输出它的镜像例如:思路:看见此题目首先想到的应该是二叉树的层次遍历,而且是反向的。但是希望的是在函数结束之后,只返回根节点,就可实现这样的效果,那么我们就不能当做简单的遍历了,我们需要在原二叉树上交换各个节点的左右孩子。因此这道题可以用递归解决代码实现:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; .原创 2022-04-24 15:32:43 · 1052 阅读 · 0 评论 -
数的子结构
题目描述:输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。思路:关于二叉树的大部分题目其实都是可以用递归的方法解决的,所以看到此题首先要想到递归此题共有三种情况,如下:当前A的根节点与B的根节点相等,直接采用递归的方式判断各个节点的值是否相等就好; 当前A的根节点与B的根节点不相等,寻找此节点的左孩子,判断是否与B的根节点相等,当找到相等的那个点时,以此点为根节点,依次判断与B对应的各个节点是否相等;原创 2022-04-23 23:30:28 · 1295 阅读 · 0 评论 -
冒泡排序详解
概述:冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果范旭则交换,直到没有反序的记录为止。冒泡的实现在细节上可以有很多种变化,我们通过具体的代码,来理解冒泡排序的思想。先来看比较容易理解的一段:void BubbleSort(int* ar, int n){ int count=0; assert(ar != NULL); for (int i = 0; i < n-1; i++) { for (int j = 0; j < n - i - 1; j原创 2022-04-04 00:38:16 · 386 阅读 · 0 评论 -
从上到下打印二叉树
题目描述:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推本题还是在二叉树层次遍历的基础上改动过来的,有需要的话,可以先看看我前两篇的题解,有助于理解此题:https://blog.csdn.net/qq_54669536/article/details/123940163https://blog.csdn.net/qq_54669536/article/details/123941309思路原创 2022-04-03 20:56:57 · 1483 阅读 · 0 评论 -
从上到下打印二叉树
题目描述:从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。此题是在层次遍历的基础上改动过来的,有需要的话,可以先看看我的上一篇题解:https://blog.csdn.net/qq_54669536/article/details/123940163题目解析:此遍历方式本质还是二叉树层次遍历,只是加了一个条件,将每一层分开输出。其实实现方式是很简单的,我们只需要在while循环内层再加一个循环,因为我们入队是一层一层入队的,当入完一层后,我们记录当前队列中的元素个数s原创 2022-04-03 18:09:27 · 873 阅读 · 0 评论 -
从上到下打印二叉树
题目描述:从上到下打印二叉树的每个节点并且同一层的节点按照从左到右的顺序打印题目解析:此题目即是我们平常所说的二叉树的层次遍历。不论哪种遍历方式,都是要从根节点开始的,而此时的层次遍历,我们既要从头结点开始,也要首先打印出来,后续的也是。所以,层次遍历遵从了这样一个特点,先进的先出,后进的后出,这个时候我们使用队列是最方便的。定义一个队列,若根节点不为空,则进行入队,判断队列为不为空,不为空的时候出队并进行打印,判断出队的节点它的左右孩子是否为空(注意一定是先左后右),不为空时继续入队,然后出队下一个节原创 2022-04-03 17:01:54 · 603 阅读 · 0 评论 -
旋转数组的最小元素
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。 注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。思路原创 2022-04-03 12:27:43 · 478 阅读 · 0 评论 -
二维数组中的查找
题目描述:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路解析:对于这个题,我们可能第一时间想到的就是使用暴力遍历整个矩阵,这个办法是可行的,但是此方法似乎没有用到矩阵从左到右,从上到下的特点,显然不是最优解法,时间复杂度达到了O(NM)。回想我们在一维递增数组中查找元素的时候,也是通过二分查找来提高效率的,不会从头到尾的遍历。那么对于这个二维数组,我们也需要利原创 2022-04-03 11:06:32 · 293 阅读 · 0 评论 -
0~n-1中缺失的数字
题目描述:一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。思路描述:对于这道题,我们首先想到的就是暴力破解,遍历一边找出来,但是如果数组很大的话,这样的时间复杂度就太高了。注意题目:递增排序数组,并且数组元素全部唯一且是从0开始的,那么数组元素应该等于对应的下标。既然是这样。我们可以直接找到数组中间节点,判断nums[mid]==mid;如果相等,说明前半部分没有缺失元素,去后半部分找,原创 2022-03-31 23:00:21 · 666 阅读 · 0 评论 -
在排序数组中查找数字
题目描述:统计一个数字在排序数组中出现的次数方法一思路描述:看到这个题目,我们首先想到的就是利用map直接统计次数,思路非常简单,将数组元素全部存到map中,然后直接统计即可:代码实现:class Solution {public: int search(vector<int>& nums, int target) { unordered_map<int,int>s; for(int num:nums)原创 2022-03-31 22:31:55 · 420 阅读 · 0 评论 -
数组中的重复数字
题目描述:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字方法一思路描述:最容易想到的就是暴力求解了,但是又没有更简单的方法呢?我们可以利用map,将数组中的元素添加到map中,在添加时先判断此键值是否为真,若为真,说明元素已经存在,此元素是重复的;若不为真,则说明是第一次添加,设置为真。代码实现:class Solution {public: in原创 2022-03-31 21:28:58 · 384 阅读 · 0 评论 -
左旋转字符串
题目描述:字符串的左旋转是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如:输入字符串“abcdefg”和数字2,该函数将返回左旋转两位得到的结果"cdefgab"方法一解题思路:既然是字符串,我们就可以利用string类型的成员函数。将字符串的前n个字符尾插到字符串的后边,然后再将前边的前n个字符删除掉,就可以了。代码实现:string reverseLeftWords(string s, int n) { for(int i=0;i原创 2022-03-30 17:03:32 · 453 阅读 · 0 评论 -
复杂链表的复制
题目描述:请实现copyRandomList函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个next指针指向下一个节点,还有一个random指针指向链表中的任意节点或者NULL;题目疑问:链表复制明明可以直接遍历链表,创建新节点实现,这里的random指针起什么作用?题目解疑:如题目所述,这里需要的是复杂链表的复制,这里的random指针起什么作用并不重要,重要的是我们如何将随机指针正确的复制过去。思路:...原创 2022-03-30 16:18:18 · 355 阅读 · 0 评论 -
*链表逆转
题目描述:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点//头结点定义 struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} };思路:对于链表逆置,最常用的方法就是一直头插了和反转节点的next了,这两种方法又分别有两种情况,链表有头结点和链表无头结点。一直头插:一直头插就是将原有链表的节点从前到后一个一个拆下来再重新原创 2022-03-30 14:45:57 · 884 阅读 · 0 评论 -
定义栈的数据结构并得到最小元素
题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)栈的数据结构都是很简单的,此题的主要难点就是如何在时间复杂度为O(1)的情况下找到最小元素思路:要想只调用一次函数就得到最小元素,那么最小元素必须是栈顶元素。要达到这个目的,只能是在元素入栈时就比较之后再存放,将最小的较小的元素放在栈顶(注意:这里说的是较小,而不是最小)。对于一个栈来说,随着入栈元素的增加,不一定能将最小的元素放在栈顶,如图:原创 2022-03-28 17:27:32 · 1549 阅读 · 0 评论 -
两个栈实现一个队列
题目描述:用两个栈实现一个队列,分别完成在队列尾部插入整数和在队头删除整数的功能。(若队列中没有元素,删除函数返回-1)解题思路:众所周知,栈的基本特点是先入后出,队列的基本特点是先入先出。那么两个栈所需要完成的任务就是一个先入,一个先出,那么如何实现这个功能呢?我们将栈1功能定为入队,栈2功能定为出队,此时要让先入栈1的先出,我们可以把栈1的所有元素都入到栈2中(顺序反过来),再将栈2的第一个元素出栈(相当于栈1的尾部元素==队列的头部元素),最后将栈2的元素重新入栈到栈1中。如此即可完成队列的头部出队,原创 2022-03-28 16:21:56 · 426 阅读 · 0 评论