![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
牛客
动态规划,简单算法问题
Persistence_Y_1
这个作者很懒,什么都没留下…
展开
-
典型动态规划问题, 连续子数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)示例就拿{6,-3,-2,7,-15,1,2,2}来说连原创 2020-06-14 10:28:47 · 222 阅读 · 0 评论 -
求n项和, 不使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句
题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。代码示例:class Sum{public: Sum() { _sum += _i; ++_i; } static void Init() { _s...原创 2020-05-18 20:10:07 · 476 阅读 · 0 评论 -
二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。二叉树的镜像定义:源二叉树镜像二叉树思路:递归思路, 交换当前节点左右节点, 递归左子树, 递归右子树.非递归思路,...原创 2020-04-26 21:10:22 · 106 阅读 · 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.思路:通过分析其实不难发现, 在矩阵当中只有四条路可走:从左往右从上往下从右往左从下往上确定了这四条路...原创 2020-04-27 20:32:52 · 203 阅读 · 0 评论 -
二叉树的子结构
问题描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路:首先实现一个函数, 判断两棵树的结构是否相同从数A的根节点开始, 递归左子树, 递归右子树, 逐个与树B进行比较, 当两棵树结构相同时, 说明树B是树A的子树代码示例:/*struct TreeNode { int val; struct TreeNode *left; ...原创 2020-04-16 17:56:40 · 144 阅读 · 0 评论 -
合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。题目来源: 牛客网思路:整体思路而言, 就是双指针, 把每一个节点的值拿出来与要插入的链表比较, 也用到插入排序的一个思路, 只是将数组换成了链表最重要的是, 我们要插入一个节点就要注意相关节点的断链和链接具体的操作流程见代码及代码注释代码示例:/*struct ListNode ...原创 2020-04-29 19:47:06 · 123 阅读 · 0 评论 -
反转单链表
题目描述输入一个链表,反转链表后,输出新链表的表头。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* ReverseList(ListNode* pHead...原创 2020-04-14 16:07:31 · 95 阅读 · 0 评论 -
链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。题目来源: 牛客网思路:这里提供两种思路遍历链表得到链表结点总数 count, 得到count和k的关系, 基于这个次数关系再遍历链表找到目标结点;代码示例:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), ne...原创 2020-04-18 20:22:55 · 86 阅读 · 0 评论 -
调整数组的顺序使奇数位于偶数前面
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。题目来源: 牛客网思路:主要利用插排的一个思路,根据插排思路, 默认第一个数为有序, 对应到本题就是无论奇偶.从下标为1遍历数组, 若为偶数什么都不做, 若为奇数则一次判断前面数字的奇偶性, 遇到奇数停止插入...原创 2020-04-10 20:26:29 · 82 阅读 · 0 评论 -
数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0.题目来源: 牛客网思路: 其中用到了快速幂算法, 还有需要注意底数和指数的关系问题特殊情况:1. base == 0时, exponent = 0, return 1; // 一般的将0^0看作1, 不必纠结2. base =...原创 2020-04-20 21:27:26 · 103 阅读 · 0 评论 -
旋转数组的最小值
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。题目来源: 牛客网思路:题目告诉给定的是一个非递减排序的数组的一个旋转, 例如数组{3,4,5,1,2}为...原创 2020-04-09 17:35:57 · 481 阅读 · 0 评论 -
用两个栈实现一个队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。题目来源: 牛客网思路:队列最重要的特征就是先进先出, 而栈是先进后出因此, 可以将数据全部压入栈1中, 实现push操作pop操作是为了删除栈底的数据, 可以将栈1中的数据依次取出压入栈2, 直至栈1为NULL, 此时栈2的栈顶数据则为我们需要删除的数据, 对栈2执行pop操作即可.最后将栈2...原创 2020-04-03 15:23:59 · 95 阅读 · 0 评论 -
根据二叉树前序遍历和后序遍历的结果重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。题目来源: 牛客网思路: 递归构建二叉树代码示例:struct TreeNode { int val; TreeNode *...原创 2020-04-11 21:21:38 · 535 阅读 · 0 评论 -
从尾到头打印链表
题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。题目来源: 牛客网思路: 链表遍历, 不断头插链表遍历方法:for (cur = head; cur != NULL; cur = cur->next);代码示例:class Solution {public: vector<int> printListFromTailToHead(L...原创 2020-04-06 20:28:02 · 108 阅读 · 0 评论 -
替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。题目来源: 牛客网思路:遍历字符串, 求空格数量, 字符串长度根据空格数量计算新字符串的长度利用新旧长度从后往前依次赋值代码示例:class Solution {public: void replaceSpac...原创 2020-04-05 21:04:05 · 100 阅读 · 0 评论 -
二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。题目来源: 牛客网思路:暴力搜索, 直接遍历二维数组.题目中告诉了每个一维数组长度相同,每一行从左到右递增每一列从上往下递增根据这个规则, 我们可以不用暴搜, 二维数组可以看作一个矩...原创 2020-04-01 19:01:46 · 119 阅读 · 0 评论 -
二叉树遍历
题目描述编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。输入描述输入包括1行字符串,长度不超过100。示例输入:abc##de#g##f###输出:c b e g d f a题...原创 2020-03-28 20:21:03 · 188 阅读 · 0 评论 -
回文串分割
问题描述给定一个字符串s, 分割s使得分割出的每一个子串都是回文串.计算将字符串s分割成回文分割结果的最小切割数例如: 给定字符串 s = “aab”;返回 1. 因为回文分割结果[“aa”, “b”]是切割一次生成的回文串就是指正着读和反着读都一样的字符串, 比如 “level”用F(i)表示到第 i 个字符需要的最小分割数给定一个 j < i, 如果此时从 j + 1 到 ...原创 2019-12-23 22:34:43 · 475 阅读 · 0 评论 -
最小路径和
问题描述给定一个非负整数填充的m*n的二维数组, 现在要从二维数组的左上角走到右下角, 请找出路径上的所有数字之和的最小路径注意: 每次只能向下或向右移动用F(i, j)表示从(0, 0)到(i, j)的的最短路径F(i, j) = min(F(i, j - 1), F(i - 1, j)) + (i, j)注意初始化: 第0行, 第0列F(0, i) = F(0, i - 1) + ...原创 2019-12-18 23:18:19 · 64 阅读 · 0 评论 -
路径总数
问题描述一个机器人在m*n大小的地图的左上角, 机器人每次向下或向右移动, 机器人要到达地图的右下角,可以有多少种不同的路径从起点走向终点.用(0, 0)表示起始点(i, j)表示终点也就是说,问题可以分解为下面的子问题:从(0, 0)到(1, 0), (2, 0), (3, 0)…(m - 1, n - 1)的路径数用F(i, j)表示从(0, 0)到(i, j)的路径数, 状态递推...原创 2019-12-17 22:06:22 · 378 阅读 · 0 评论 -
三角矩阵
问题描述给定一个三角矩阵, 计算从三角矩阵顶部到底部的最小路径和, 每一步都可以移动到下面一行相邻的数字比如, 给定下面的三角矩阵[2][3] [4][6] [5] [7][4] [1] [8] [3]最小的从顶部到底部的路径和层为2 + 3 + 5 + 1 = 11思路1class Solution {public: int minim...原创 2019-12-16 21:59:49 · 1957 阅读 · 0 评论 -
斐波那契数列
题目描述输入一个整数n, 请你输出斐波那契数列的第n项(从第0项开始, 第0项为0)首先是递归思路:class Solution {public:int Fibonacci(int n) {if (n == 0){return 0;}if (n == 1 || n == 2){return 1;}return Fibonacci(n - 2) + Fibonacci(n...原创 2019-12-15 19:47:44 · 98 阅读 · 0 评论 -
字符串分割
题目描述给定一个字符串,和一个词典dict, 确定s是否可以根据词典中的词分成一个或多个单词.举个例子:比如, 给定s = “leetcode”dict = [“leet”, “code”]返回true, 因为"leetcode"可以被分成"leet"和"code"方法动态规划首先我们对题目分析, 给出一个状态, 假设一个状态F(i):F(i)表示给定字符串的的前i个字符能否根...原创 2019-12-12 21:57:45 · 546 阅读 · 0 评论