摘要: 斐波那契数列 题目链接 Solution 求斐波那契数列第n项。 实现方法很多,递推,递归,记忆化搜索,以及通项公式。 递推方法如下: 根据斐波那契的地推公式:\(f[n] = f[n - 1] + f[n - 2]\) Code class Solution { public: int Fibon 阅读全文
posted @ 2020-11-26 23:32 mjt233 阅读(107) 评论(0) 推荐(0)
摘要: 拼接所有的字符串产生字典序最小的字符串 题目链接 Solution 是拼接后的字符串字典序最小。 根据贪心的思路,字典序小的放在前面比较优秀。比如"abc"放到"bca"的前面更好。 但是这样有个问题,就是字符串长度的问题,比如"bc""bca"此时应该将字典序大的"bca"放到前面。 为了解决此问 阅读全文
posted @ 2020-11-26 23:31 mjt233 阅读(347) 评论(0) 推荐(0)
摘要: 丑数 题目链接 Solution 丑数是任意个2,3,5相乘得到的。 每个丑数都可以乘以一个2,3,5得到一个新的丑数。 根绝这个思想,我们可以递推出所有的丑数。 首先顶一个数组存储所有的丑数,并从头开始扫描所有丑数,每个丑数都乘以2,3,5,得到新的丑数。所以设三个指针分别表示接拿下来轮到那个数乘 阅读全文
posted @ 2020-11-26 23:30 mjt233 阅读(69) 评论(0) 推荐(0)
摘要: 最小的K个数 题目链接 Solution 求最小的k个数。 首先肯定是将数组从小到大排序,不然不好选择。 然后从头开始取k个数即可。 Code class Solution { public: vector<int> GetLeastNumbers_Solution(vector<int> inpu 阅读全文
posted @ 2020-11-26 23:29 mjt233 阅读(39) 评论(0) 推荐(0)
摘要: 字符串的排列 题目链接 Solution 计算一个字符串的所有排列。 c++ stL库中有一个$next_permutation()$函数是可以按字典序大小计算出当前排列的下一个排列的,同样$pre_permutation$可以计算出上一个排列。 所以我们可以将字符串排序,然后依次计算下一个排列即可 阅读全文
posted @ 2020-11-26 23:26 mjt233 阅读(39) 评论(0) 推荐(0)
摘要: 反转字符串 题目链接 Solution 将字符串反转。 实现方法很多,比如reverse函数。 但是模拟下也不难,直接从后往前扫一遍即可。 Code class Solution { public: string solve(string str) { string ans; for (int i 阅读全文
posted @ 2020-11-26 23:22 mjt233 阅读(64) 评论(0) 推荐(0)
摘要: 找到字符串的最长无重复字符子串 题目链接 Solution 寻找最长的无重复子串。 考虑以一个位置结尾的可以往前延伸到的位置,根据此位置求出无重复子串的长度。 具体操作可以记录一个指针,这个指针记录到当前位置时,可以往前延伸的最前的位置。 考虑如何更新指针,从一个位置到下一个位置时,加入了一个数a: 阅读全文
posted @ 2020-11-26 23:20 mjt233 阅读(96) 评论(0) 推荐(0)
摘要: 岛屿数量 题目链接 Solution 给定一个方格图,求联通块的个数。 求联通块,并查集可做。 我们可以把所有相邻的两个是1的位置,用并查集合并起来,最后计算有多少个并查集即可。 具体实现:扫描整个地图,如果是1,看其上下左右是不是1,如果是,合并。 详见代码,附有注释。 Code class So 阅读全文
posted @ 2020-11-26 22:57 mjt233 阅读(91) 评论(0) 推荐(0)
摘要: 排序 题目链接 Solution 单纯的考察讲一个vector排序。 排序方法有很多种,如快速排序,归并排序,冒泡排序,选择排序等。 但最简单的是调用algorithm库中的sort函数,详见代码。 Code class Solution { public: vector<int> MySort(v 阅读全文
posted @ 2020-11-26 22:44 mjt233 阅读(56) 评论(0) 推荐(0)
摘要: 股票交易的最大收益 题目链接 Solution 已经知道每一天股票的价格,可以无限次交易,每天只能进行一次,询问最大收益。 这类问题可以动态规划解决。 设$f[i]$表示到第i天的时候,最大收益是多少。 首先$f[i]$可以直接从上一天继承过来,即$f[i] = f[i - 1]$。 其次,如果在第 阅读全文
posted @ 2020-11-26 22:26 mjt233 阅读(164) 评论(0) 推荐(0)
摘要: 调整数组顺序使奇数位于偶数前面 题目链接 Solution 让奇数排在偶数前面。当然可以暴力的扫一遍,将奇数偶数分开然后组合合并。 但是algorithm库中的sort函数支持自定义排序函数,即让奇数偶数作为权值排序。 即用数字模2作为大小排序。 使用方式详见代码,代码较为简单易懂。 Code cl 阅读全文
posted @ 2020-11-26 22:10 mjt233 阅读(72) 评论(0) 推荐(0)
摘要: 字符串变形 题目链接 Solution 将字符串按单词反转,并反转大小写。 从后往前扫,如果遇到空格,说明从这个空格的位置到下一个空格之间是一个单词。 然后将单词的每个字母依次取出,取出的过程变化大小写。 Code class Transform { public: char trans(char 阅读全文
posted @ 2020-11-26 22:09 mjt233 阅读(55) 评论(0) 推荐(0)
摘要: 旋转字符串 题目链接 Solution 直接模拟即可。 枚举旋转了几位,然后求出旋转后的字符串,比较是否与原字符串相同。 注意一下,如果两个字符串长度不同,无论如何旋转都不可能相同的,直接返回false。 Code class Solution { public: bool solve(string 阅读全文
posted @ 2020-11-26 22:04 mjt233 阅读(78) 评论(0) 推荐(0)
摘要: 连续子数组的最大和 题目链接 Solution 最大子段和问题,可以使用动态规划解决此问题。 设$dp[i]$表示以i结束的子段的最大子段和。 所以到i时有两种选择,和前面的最大子段结合,自己构成一个新的子段。 得到转移方程$dp_i = max{dp_{i - 1} + array_i, arra 阅读全文
posted @ 2020-11-26 22:03 mjt233 阅读(80) 评论(0) 推荐(0)
摘要: 换钱的最少货币数 题目链接 Solution 问n种货币凑成一个面额所需要的最少货币数。 动态规划。 $dp_i$表示凑成面额i的需要的最少货币数。 然后枚举每个面额的货币,更新dp数组即可。 \(dp[i] = min(dp[i], dp[i - a[j]])\) Code class Solut 阅读全文
posted @ 2020-11-26 22:00 mjt233 阅读(70) 评论(0) 推荐(0)
摘要: 最长公共前缀 题目链接 Solution 求n个串的最长公共前缀。 从0开始枚举答案,然后依次比较所有字符串的这一位,如果都相同,那么答案+1。 注意一下答案最大是最小的字符串的长度。 数据范围较小,暴力可过。 Code class Solution { public: string longest 阅读全文
posted @ 2020-11-26 21:57 mjt233 阅读(74) 评论(0) 推荐(0)
摘要: 旋转数组 题目链接 Solution 模拟。 新建一个vector,先加入后面n-m个元素,然后加入前面m个元素即可。 代码实现较为简单,需要注意下m如果大于n的情况,需要让m模n。 Code class Solution { public: vector<int> solve(int n, int 阅读全文
posted @ 2020-11-26 21:56 mjt233 阅读(71) 评论(0) 推荐(0)
摘要: 数字在升序数组中出现的次数 题目链接 Solution 暴力。 询问一个数出现的次数,扫一遍数组,如果当前数和这个数相等,答案+1。 没有什么太难的地方,详见代码,代码比较简单易懂。 当然因为数组是升序的,可以二分出第一个大于这个数的位置和第一个小于这个数的位置,然后做差得到答案,但是数据范围较小, 阅读全文
posted @ 2020-11-26 21:54 mjt233 阅读(66) 评论(0) 推荐(0)
摘要: 反转数字 题目链接 Solution 将一个数字反转,思路比较简单,可以考虑分成两步。 首先将数字拆分成0-9,存下。 将拆分后的数字从后往前组合起来,即可实现反转操作。 Code class Solution { public: int reverse(int x) { int ans = 0, 阅读全文
posted @ 2020-11-26 21:52 mjt233 阅读(140) 评论(0) 推荐(0)
摘要: 数组中出现次数超过一半的数字 题目链接 Solution 求出现次数大于一半的数。 直接开一个map,统计每个数字出现的个数,最后扫一遍原数组,找到出现次数大于一半的数字即可。 Code class Solution { public: int MoreThanHalfNum_Solution(ve 阅读全文
posted @ 2020-11-26 21:51 mjt233 阅读(85) 评论(0) 推荐(0)
摘要: palindrome-number 题目链接 Solution 判断一个数字是否是回文串。 回文串的定义是正着读和反着读相同,所以我们可以把数字反转后,判断两个数字是否一样即可。 反转数字的方法是将n不断对10取模,然后除以10。 Code class Solution { public: bool 阅读全文
posted @ 2020-11-26 21:32 mjt233 阅读(67) 评论(0) 推荐(0)
摘要: 求路径 题目链接 Solution 从左上角走到右下角,只能向右走或者向下走,求方案数。 这是一个经典的问题。 问题转化为走n+m-2次,其中向右走m-1次,向下走n-1次。 也就是类似“右右下右下下...”的序列有多少个。 所以方案数就是在n+m-2个位置中选择m-1个位置是右,剩下的是下。 所以 阅读全文
posted @ 2020-11-26 21:29 mjt233 阅读(72) 评论(0) 推荐(0)
摘要: 牛客题霸--进制转换 题目链接 Solution 进制转换的方法较为经典。 对于一个十进制的是数,每次对M取模,然后除以M(M为转换后的进制)即可得到M进制数。 因为M进制的数第一位时$M0$,第二位时$M1$,第三位$M2 \cdots$ 所以如果10进制的数n大于$Mk$(k是最大的,即$n<M 阅读全文
posted @ 2020-11-26 21:24 mjt233 阅读(78) 评论(0) 推荐(0)
摘要: 两数之和 题目链接 Solution 寻找两个数,使它们的和等于所给的值。 因为数据范围较小,所以可以直接枚举两个数,求和计算比较即可。 Code class Solution { public: vector<int> twoSum(vector<int>& numbers, int target 阅读全文
posted @ 2020-11-26 21:07 mjt233 阅读(75) 评论(0) 推荐(0)
摘要: 数组中只出现一次的数字 题目链接 Solution 只有两个数字出现了1次,其他数字都出现两次。 所以定义一个map,记录每个数字出现的次数。 最后扫一遍数组,找出只出现一次的数字即可。 Code class Solution { public: void FindNumsAppearOnce(ve 阅读全文
posted @ 2020-11-26 21:05 mjt233 阅读(64) 评论(0) 推荐(0)
摘要: 买卖股票的最好时机 题目链接 Solution 因为只有一次买入卖出的机会,所以可以枚举在哪天卖出。 对于卖出的那一天,买入的那一天一定在这一天之前,并且是价格最低的。 所以从前往后扫,记录并更新最小值即可。 Code class Solution { public: int maxProfit(v 阅读全文
posted @ 2020-11-26 20:51 mjt233 阅读(53) 评论(0) 推荐(0)
摘要: 跳台阶 题目链接 Solution 每次可以跳上1级台阶,也可以跳上2级。求跳到n级的台阶总共有多少种跳法。 dp可以解决此类计数问题。 设f[i]表示到第i层台阶的方案数,显然$f_1 = 1$, \(f_2 = 2\); 有递推式:\(f[n] = f_{n - 1} + f_{n-2}\) 所 阅读全文
posted @ 2020-11-26 20:46 mjt233 阅读(44) 评论(0) 推荐(0)
摘要: 合并两个有序的数组 题目链接 Solution 因为AB都是有序的,所以定义两个指针,从前往后依次比较当前元素,小的加入到新的队列中,然后指针右移。 类似归并排序中的归并操作。 class Solution { public: void merge(int A[], int m, int B[], 阅读全文
posted @ 2020-11-26 20:33 mjt233 阅读(70) 评论(0) 推荐(0)
摘要: 括号序列 题目连接 Solution 判断一个括号序列是否合法。 用一个栈来判断,如果是左括号就加入到栈顶,如果是右括号就看一下这个括号能不能和栈顶的左括号匹配。 最后特判一下,如果栈没有空,说明左括号的数量多,也是不合法的。 class Solution { public: stack<char> 阅读全文
posted @ 2020-11-26 20:25 mjt233 阅读(74) 评论(0) 推荐(0)