基础算法练习
学习过程中比较基础的算法
小灰机大
一时躺平一时爽~
一直躺平一直爽~
爱好摸鱼,擅于拖延,向往躺平~
展开
-
青蛙跳台阶二
题目一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:思路:n阶台阶有f(n)种方法第一次如果跳1阶,其余台阶有f(n-1)种方法,第一次如果跳2阶,其余台阶有f(n-2)种方法,第一次如果跳3阶,其余台阶有f(n-3)种方法,...第一次如果跳n-1阶,其余台阶有f(1)种方法,第一次如果跳n阶,只...原创 2019-05-19 16:36:40 · 144 阅读 · 0 评论 -
链表中倒数第k个数
题目输入一个链表,输出该链表中倒数第k个结点。思路两个指针,p1,p2。p1先走(k-1)步,然后p1,p2同时走,当p1走到最后一个结点的时候p2指向的就是倒数第k个结点。示例输入表的结点值为:0,1,2,3,4,5,6 求倒数第2个输出:55代码#include <iostream>using namespace std;struct Li...原创 2019-05-22 15:55:45 · 223 阅读 · 0 评论 -
输入一个链表,反转链表后,输出新链表的表头
题目输入一个链表,反转链表后,输出新链表的表头。思路用两个临时指针,一个指向当前指针的上一个结点,一个指向当前指针的下一个结点,然后改变当前指针指向的当前结点的指针的方向示例输入:0 1 2 3 4 5 6 7输出:7 6 5 4 3 2 1 0代码#include <iostream>using namespace std;struct ListN...原创 2019-05-22 20:51:05 · 207 阅读 · 0 评论 -
合并两个排序链表
题目输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路建头、尾新指针。两个链表,链表头结点值,尾指针指向较小值的结点,然后此链表头指针后移一位,直至有一个链表结束。返回新指针。示例list1:0 1 2 3 4 5 6 7list2:3 4 5 6 7 8 9 10 11 12 13合并后:0 1 2 3 3 3 4 4 5 5...原创 2019-05-22 22:51:34 · 101 阅读 · 0 评论 -
栈的压入、弹出序列
题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路两个数组A,B,其中A为入栈序列,B为出栈序列。 借助一个辅助栈,先压入A中首...原创 2019-05-27 18:51:22 · 101 阅读 · 0 评论 -
从上往下打印二叉树
题目从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路广度优先搜索。借助一个队列,检查队列首元素,如果有左孩子则push leftChild,如果有右孩子则push rightChild, 然后打印首元素,并且pop()首元素。当队列里没有元素了,则说明已经打印了所有结点。示例如果一棵由:前序:{1,2,4,5,3,7}中序:{1,2,4,5,3,7}确定的树。...原创 2019-05-27 21:00:23 · 92 阅读 · 0 评论 -
二叉搜索树的后序序列
题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路1、因为是二叉搜索树 ,所以每个结点的左边都小于根结点,右边都大于根结点;2、而二叉搜索树的子树也是二叉搜索树,因此也符合13、因此,除了最后结点之外的序列前部分小于结点值,后半部分大于结点值,因此可以加一个变量计算结点数量4、如果: ...原创 2019-05-30 19:07:35 · 131 阅读 · 0 评论 -
树的子结构
题目二叉树A中是否包含二叉树B思路轮询A找到与B根节点相同的点,然后 递归查询B的左、右子树是否与A中对应结点相同见代码注释代码struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) :val(x),left(nullptr...原创 2019-05-23 21:37:11 · 85 阅读 · 0 评论 -
二叉树的和为某一值的路径
题目输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路利用深度优先搜索遍历所有的路径,然后将路径压入vector<vector<int>>中,并返回。示例 /* 构造的树 * 9 * ...原创 2019-05-31 16:00:49 · 104 阅读 · 0 评论 -
复杂链表的复制
题目输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路复制一个新链表,但每复制一个结点都和原结点map建立一个对应关系。point->next在复制新链表的时候自然已有,然后轮询原链表,利用map对应关系,将新链表...原创 2019-05-31 22:39:01 · 75 阅读 · 0 评论 -
字符串排序
题目输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。思路递归思想,参考别人,感谢原作者。原文地址:https://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7固定第1位:让...原创 2019-06-06 13:45:36 · 204 阅读 · 0 评论 -
数组中数字出现次数超长度一半的数字
题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路先mark[ todo]先写方法1,比较暴力,比较愚蠢,时间复杂度会比较大利用map,把原数组中每个不同元素作为key,出现的次数作为value。返回value 大...原创 2019-06-06 18:56:12 · 118 阅读 · 0 评论 -
最小的k个数
题目输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路先对原数组进行排序,然后输出前k个数字排序使用:1、algorithm中自带的sort2、冒泡排序3、快排4、堆排序示例代码#include <iostream>#include <vector>#include...原创 2019-06-07 19:15:15 · 73 阅读 · 0 评论 -
连续子数组的最大和
题目HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的...原创 2019-06-07 22:33:26 · 115 阅读 · 0 评论 -
二叉搜索树与双向链表
题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路考虑不能创建结点,不能辅助空间。使用递归,输出顺序为中序遍历顺序。使用一个辅助指针记录当前结点的上一个结点,从左子树开始调整。示例 7 / \ 5 10 / \ / \ 3 6 8 12 \ ...原创 2019-06-04 20:17:56 · 91 阅读 · 0 评论 -
调整数组顺序奇数前偶数后
题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路思路:开两个队列,分别为queue1和queue2;轮询数组,把奇数放进queue1,把偶数放进queue2。然后把queue1和queue2放进vector示例输入:123456输出:135246...原创 2019-05-22 13:11:23 · 153 阅读 · 0 评论 -
包含min函数的栈
题目定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。思路借助一个辅助栈,每次主栈入栈的时候,辅助栈也入栈;如果入栈的数字小于辅助栈的栈顶则辅助栈压入此数字,如果大于等于栈顶元素,则压入栈顶元素;如此辅助栈的栈顶任何时候都是此栈的最小元素。示例stack1(从栈顶到栈底):9 1 2 2 1 32 111 11 3 2 1...原创 2019-05-25 18:51:04 · 103 阅读 · 0 评论 -
青蛙跳台阶一
青蛙跳台阶一题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。 求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。思路: 类似于斐波那契数列:第1次跳了一阶,剩余f(n-1)种方法;若第1次跳了两阶,剩余f(n-2)种; 故: f(n) = f(n-1) + f(n-2) // n>2;测试: 输入:5 ...原创 2019-05-19 13:05:17 · 603 阅读 · 0 评论 -
斐波那契数列
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。 n<=39 思路:没什么思路,斐波那契数列:前两个数字是0、1,;之后所有的数字都是前两个数字的和; 注意:第0次为0,第1次为1; 输入: 10 输入出: 前 10 个斐波那契数是: 1 1 2 3 5 8 13 2...原创 2019-05-19 10:50:47 · 147 阅读 · 0 评论 -
返回旋转数组中最小值
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。/** 思路:* 1、遍历整个数组,返回最小值,时间复杂度O(n)* ...原创 2019-05-19 00:27:32 · 149 阅读 · 0 评论 -
用两个栈来实现一个队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路: 一个栈stack1作为队列,另一个栈stack2作为临时使用。 当push队列时,直接stack1.push()就好了,当pop时,先将stack1中所有元素压缩入stack2中 并清空stack1,然后将stack2中栈顶元素返回并pop,...原创 2019-05-18 17:26:06 · 90 阅读 · 0 评论 -
通过前序和中序确定一个二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果, 请重建出该二叉树。假设输入的前序遍历和 中序遍历的结果中都不含重复的数字。 例如输入: 前序遍历序列{1,3,2,5,4,7}和 中序遍历序列{2,3,5,1,7,4},则重建二叉树并返回。 测试: 输入 前序序列{1,3,2,5,4,7} 中序序列{2,3,...原创 2019-05-18 13:08:43 · 1707 阅读 · 0 评论 -
链表数据翻转输出
题目描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。/* * 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。 * * 思路: * 1、将链表中每个结点的值压入栈中 * 2、从栈中依次取出栈顶元素并写入整型数组中 * * * 输入: * ListNode 类型链表 0 1 2 3 * 输...原创 2019-05-16 17:34:08 · 206 阅读 · 0 评论 -
替换给定字符串中的空格
题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”。 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 思路: 从前往后轮训,遇到空格替换“%20”,将空格后每个数据后移两个单位距离,所以: 先线轮训判断空格数量n,之后从后向前,每遇到一个空格前将每个元素向后移动(n-i)*2个单位,空格处开...原创 2019-05-15 21:14:56 · 87 阅读 · 0 评论 -
二维数组中的查找
/* * 题目描述 * 在一个二维数组中(每个一维数组的长度相同), * 每一行都按照从左到右递增的顺序排序,每一列都 * 按照从上到下递增的顺序排序。请完成一个函数, * 输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路: 利用二分查找,左下角的数据为中间点,上面的数据都小于他,右边的数据都大于他, 故可以他为起点进行轮训,大于他向右移动一步,小...原创 2019-05-14 22:06:25 · 98 阅读 · 0 评论 -
把字符串转换成整数
题目描述将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0示例1输入+2147483647 ...原创 2019-05-12 10:07:58 · 119 阅读 · 0 评论 -
小矩形块组成大矩形块
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?思路:先下结论,还是斐波那契如同,如果第一个方块是纵向放置,则剩余的是f(n-1)种,如果第一次放置时横向放置,则第二块位置只能横向放置,因此剩余f(n-2)种因此:f(n) = f(n-1) + f(n-2)故,显而易见,又是斐波那契数列。...原创 2019-05-20 01:41:42 · 997 阅读 · 0 评论 -
整数二进制中1的个数
题目输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路方法一如果是0,返回0如果是正整数,除二取余法如果是负数:3.1 如果是 -2147483648(int表示最大绝对值的负数),其补码是1000 0000 0000 0000 0000 0000 0000 0000, 故返回 13.2 其他负数,则用 re = 2147483647(int表示最大的整数...原创 2019-05-20 15:09:11 · 333 阅读 · 0 评论 -
二叉树的镜像
题目操作给定的二叉树,将其变换为源二叉树的镜像思路利用广度优先遍历的思想。利用一个队列,每次讲队首元素的左右孩子先交换,再入队,递归如此。示例利用前序和中序生成一棵树:pre:8,6,5,7,10,9,11,12mid:5,6,7,8,9,10,11,12输出(广度优先遍历):8 10 6 11 9 7 5 12代码#include <iostream>...原创 2019-05-24 14:36:54 · 96 阅读 · 0 评论 -
顺时针打印二维数组
题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.思路利用一个双向队列数组vector<deque>,vector[start] 从前往后输出,ve...原创 2019-05-25 17:30:22 · 349 阅读 · 0 评论 -
数值的整数次方
题目给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。思路方法1base == 0, return 0;exponent > 0 , return n个base相乘,exponent < 0 , return n个base相乘的倒数方法2快速求幂算法如果一个数字的999次方,那么用上述算法便需要...原创 2019-05-21 22:42:29 · 95 阅读 · 0 评论 -
打瞌睡
题目小易觉得高数课太无聊了,决定睡觉。不过他对课上的一些内容挺感兴趣,所以希望你在老师讲到有趣的部分的时候叫醒他一下。你知道了小易对一堂课每分钟知识点的感兴趣程度,并以分数量化,以及他在这堂课上每分钟是否会睡着,你可以叫醒他一次,这会使得他在接下来的k分钟内保持清醒。你需要选择一种方案最大化小易这堂课听到的知识点分值。思路本题中分数最高的即为所有没有睡觉的分数以及每个k时间段内会睡觉的...原创 2019-06-25 10:27:15 · 257 阅读 · 0 评论