自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 收藏
  • 关注

原创 牛客题霸汇总

股票交易的最大收益牛客csdn博客园拼接所有的字符串产生字典序最小的字符串牛客csdn博客园丑数牛客csdn博客园岛屿数量牛客csdn博客园换钱的最少货币数牛客csdn博客园数字在升序数组中出现的次数牛客csdn博客园斐波那契数列牛客csdn博客园反转字符串牛客csdn博客园字符串的排列牛客csdn博客园最小的K个数牛客csdn博客园排序牛客csdn博客园找到字符串的最长无重复字符子串牛客csdn博客园旋转字符串

2020-11-28 22:23:12 158

原创 牛客题霸--斐波那契数列

斐波那契数列题目链接Solution求斐波那契数列第n项。实现方法很多,递推,递归,记忆化搜索,以及通项公式。递推方法如下:根据斐波那契的地推公式:f[n]=f[n−1]+f[n−2]f[n] = f[n - 1] + f[n - 2]f[n]=f[n−1]+f[n−2]Codeclass Solution {public: int Fibonacci(int n) { int f[50]; f[1] = f[2] = 1; for

2020-11-28 12:04:57 127

原创 牛客题霸--反转字符串

反转字符串题目链接Solution将字符串反转。实现方法很多,比如reverse函数。但是模拟下也不难,直接从后往前扫一遍即可。Codeclass Solution {public: string solve(string str) { string ans; for (int i = str.size() - 1; i >= 0; --i) ans.push_back(str[i]); return ans; }};

2020-11-28 12:04:30 162

原创 牛客题霸--字符串的排列

字符串的排列题目链接Solution计算一个字符串的所有排列。c++ stL库中有一个next_permutation()next\_permutation()next_permutation()函数是可以按字典序大小计算出当前排列的下一个排列的,同样pre_permutationpre\_permutationpre_permutation可以计算出上一个排列。所以我们可以将字符串排序,然后依次计算下一个排列即可。Codeclass Solution {public: vector

2020-11-28 12:03:56 122

原创 牛客题霸--最小的K个数

最小的K个数题目链接Solution求最小的k个数。首先肯定是将数组从小到大排序,不然不好选择。然后从头开始取k个数即可。Codeclass Solution {public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { sort(input.begin(), input.end()); vector<int> ans;

2020-11-28 12:03:26 63

原创 牛客题霸--丑数

丑数题目链接Solution丑数是任意个2,3,5相乘得到的。每个丑数都可以乘以一个2,3,5得到一个新的丑数。根绝这个思想,我们可以递推出所有的丑数。首先顶一个数组存储所有的丑数,并从头开始扫描所有丑数,每个丑数都乘以2,3,5,得到新的丑数。所以设三个指针分别表示接拿下来轮到那个数乘2,乘3,乘5。进行n次,即可得到第n个丑数。Codeclass Solution {public: int GetUglyNumber_Solution(int index) {

2020-11-27 22:25:39 66

原创 牛客题霸--拼接所有的字符串产生字典序最小的字符串

拼接所有的字符串产生字典序最小的字符串题目链接Solution是拼接后的字符串字典序最小。根据贪心的思路,字典序小的放在前面比较优秀。比如"abc"放到"bca"的前面更好。但是这样有个问题,就是字符串长度的问题,比如"bc"“bca"此时应该将字典序大的"bca"放到前面。为了解决此问题,不能直接按字典序排序,但是我们可以按照两个字符串连起来后的字符串的字典序排序。比如"bc”“bca”,比较"bcbca"和"bcabc"那个字典序小,来确定"bc""bca"的位置。Codeclass

2020-11-27 22:25:09 476

原创 牛客题霸--股票交易的最大收益

股票交易的最大收益题目链接Solution已经知道每一天股票的价格,可以无限次交易,每天只能进行一次,询问最大收益。这类问题可以动态规划解决。设f[i]f[i]f[i]表示到第i天的时候,最大收益是多少。首先f[i]f[i]f[i]可以直接从上一天继承过来,即f[i]=f[i−1]f[i] = f[i - 1]f[i]=f[i−1]。其次,如果在第i天卖出,那么需要选择一天买入,设第j天买入,则f[i]=max{f[j−1]+a[i]−a[j]}, j∈[0,i−1]f[i] = m

2020-11-27 22:24:39 357

原创 牛客题霸--排序

排序题目链接Solution单纯的考察讲一个vector排序。排序方法有很多种,如快速排序,归并排序,冒泡排序,选择排序等。但最简单的是调用algorithm库中的sort函数,详见代码。Codeclass Solution {public: vector<int> MySort(vector<int>& arr) { sort(arr.begin(), arr.end()); return arr; }};

2020-11-27 22:24:15 91

原创 牛客题霸--岛屿数量

岛屿数量题目链接Solution给定一个方格图,求联通块的个数。求联通块,并查集可做。我们可以把所有相邻的两个是1的位置,用并查集合并起来,最后计算有多少个并查集即可。具体实现:扫描整个地图,如果是1,看其上下左右是不是1,如果是,合并。详见代码,附有注释。Codeclass Solution {public: int n, m, f[40005], vis[40005]; int dx[4] = {0, 0, -1, 1}; int dy[4] = {-1, 1

2020-11-27 22:23:29 113

原创 牛客题霸--找到字符串的最长无重复字符子串

找到字符串的最长无重复字符子串题目链接Solution寻找最长的无重复子串。考虑以一个位置结尾的可以往前延伸到的位置,根据此位置求出无重复子串的长度。具体操作可以记录一个指针,这个指针记录到当前位置时,可以往前延伸的最前的位置。考虑如何更新指针,从一个位置到下一个位置时,加入了一个数a:如果a在前面没有出现过,指针不变,并记下这个数。如果a出现过,那么指针的位置要大于a上次出现的位置,即now=max(now,last[a]);所以定义一个map,时刻更新每个数字上次出现的位置即可。

2020-11-27 22:21:52 181

原创 牛客题霸--旋转字符串

旋转字符串题目链接Solution直接模拟即可。枚举旋转了几位,然后求出旋转后的字符串,比较是否与原字符串相同。注意一下,如果两个字符串长度不同,无论如何旋转都不可能相同的,直接返回false。Codeclass Solution {public: bool solve(string A, string B) { if (A.size() != B.size()) return false; int n = A.size(); for

2020-11-27 22:21:22 176

原创 牛客题霸--字符串变形

字符串变形题目链接Solution将字符串按单词反转,并反转大小写。从后往前扫,如果遇到空格,说明从这个空格的位置到下一个空格之间是一个单词。然后将单词的每个字母依次取出,取出的过程变化大小写。Codeclass Transform {public: char trans(char ch) { if ('a' <= ch && ch <= 'z') return ch - 'a' + 'A'; else return ch

2020-11-27 22:20:51 246

原创 牛客题霸--调整数组顺序使奇数位于偶数前面

调整数组顺序使奇数位于偶数前面题目链接Solution让奇数排在偶数前面。当然可以暴力的扫一遍,将奇数偶数分开然后组合合并。但是algorithm库中的sort函数支持自定义排序函数,即让奇数偶数作为权值排序。即用数字模2作为大小排序。使用方式详见代码,代码较为简单易懂。Codeclass Solution {public: static bool cmp(int a,int b){ return (a % 2) > (b % 2); }

2020-11-27 22:20:20 78

原创 牛客题霸--数字在升序数组中出现的次数

数字在升序数组中出现的次数题目链接Solution暴力。询问一个数出现的次数,扫一遍数组,如果当前数和这个数相等,答案+1。没有什么太难的地方,详见代码,代码比较简单易懂。当然因为数组是升序的,可以二分出第一个大于这个数的位置和第一个小于这个数的位置,然后做差得到答案,但是数据范围较小,可以直接O(n)O(n)O(n)复杂度过。Codeclass Solution {public: int GetNumberOfK(vector<int> data ,int k) {

2020-11-27 22:19:49 74

原创 牛客题霸--旋转数组

旋转数组题目链接Solution模拟。新建一个vector,先加入后面n-m个元素,然后加入前面m个元素即可。代码实现较为简单,需要注意下m如果大于n的情况,需要让m模n。Codeclass Solution {public: vector<int> solve(int n, int m, vector<int>& a) { vector<int> ans; m %= n; for (int

2020-11-26 19:41:17 86

原创 牛客题霸--最长公共前缀

最长公共前缀题目链接Solution求n个串的最长公共前缀。从0开始枚举答案,然后依次比较所有字符串的这一位,如果都相同,那么答案+1。注意一下答案最大是最小的字符串的长度。数据范围较小,暴力可过。Codeclass Solution {public: string longestCommonPrefix(vector<string>& strs) { string ans; if (strs.empty()) return an

2020-11-26 19:40:47 100

原创 牛客题霸--换钱的最少货币数

换钱的最少货币数题目链接Solution问n种货币凑成一个面额所需要的最少货币数。动态规划。dpidp_idpi​表示凑成面额i的需要的最少货币数。然后枚举每个面额的货币,更新dp数组即可。dp[i]=min(dp[i],dp[i−a[j]])dp[i] = min(dp[i], dp[i - a[j]])dp[i]=min(dp[i],dp[i−a[j]])Codeclass Solution {public: int minMoney(vector<int>&am

2020-11-26 19:40:11 127

原创 牛客题霸--连续子数组的最大和

连续子数组的最大和题目链接Solution最大子段和问题,可以使用动态规划解决此问题。设dp[i]dp[i]dp[i]表示以i结束的子段的最大子段和。所以到i时有两种选择,和前面的最大子段结合,自己构成一个新的子段。得到转移方程dpi=max{dpi−1+arrayi,arrayi}dp_i = max\{dp_{i - 1} + array_i, array_i\}dpi​=max{dpi−1​+arrayi​,arrayi​}Codeclass Solution {public:

2020-11-26 19:39:39 101

原创 牛客题霸--求路径

求路径题目链接Solution从左上角走到右下角,只能向右走或者向下走,求方案数。这是一个经典的问题。问题转化为走n+m-2次,其中向右走m-1次,向下走n-1次。也就是类似“右右下右下下…”的序列有多少个。所以方案数就是在n+m-2个位置中选择m-1个位置是右,剩下的是下。所以答案就是Cn+m−2m−1C_{n + m - 2} ^ {m - 1}Cn+m−2m−1​或者Cn+m−2n−1C_{n +m - 2} ^ {n - 1}Cn+m−2n−1​。Codeclass Solut

2020-11-26 19:39:04 150

原创 牛课题霸--palindrome-number

palindrome-number题目链接Solution判断一个数字是否是回文串。回文串的定义是正着读和反着读相同,所以我们可以把数字反转后,判断两个数字是否一样即可。反转数字的方法是将n不断对10取模,然后除以10。Codeclass Solution {public: bool isPalindrome(int x) { // write code here if (x < 0) return false; int tmp

2020-11-26 19:38:31 143

原创 牛客题霸--数组中出现次数超过一半的数字

数组中出现次数超过一半的数字题目链接Solution求出现次数大于一半的数。直接开一个map,统计每个数字出现的个数,最后扫一遍原数组,找到出现次数大于一半的数字即可。Codeclass Solution {public: int MoreThanHalfNum_Solution(vector<int> numbers) { map<int,int> cnt; for (int i = 0; i < (int)number

2020-11-26 19:37:33 85

原创 牛客题霸--反转数字

反转数字题目链接Solution将一个数字反转,思路比较简单,可以考虑分成两步。首先将数字拆分成0-9,存下。将拆分后的数字从后往前组合起来,即可实现反转操作。Codeclass Solution {public: int reverse(int x) { int ans = 0, f = 1; if (x < 0) f = -1, x = -x; while (x) { ans = ans * 10 +

2020-11-26 19:36:58 276

原创 牛客题霸--进制转换

牛客题霸–进制转换题目链接Solution进制转换的方法较为经典。对于一个十进制的是数,每次对M取模,然后除以M(M为转换后的进制)即可得到M进制数。因为M进制的数第一位时M0M^0M0,第二位时M1M^1M1,第三位M2⋯M^2 \cdotsM2⋯所以如果10进制的数n大于MkM^kMk(k是最大的,即n<Mk+1n<M^{k+1}n<Mk+1)则说明第k+1位上必定是nMk\frac{n}{M^k}Mkn​,然后让n=n%Mkn=n \% M^kn=n%Mk 依次类推即可。

2020-11-26 19:36:29 219

原创 牛客题霸--买卖股票的最好时机

买卖股票的最好时机题目链接Solution因为只有一次买入卖出的机会,所以可以枚举在哪天卖出。对于卖出的那一天,买入的那一天一定在这一天之前,并且是价格最低的。所以从前往后扫,记录并更新最小值即可。Codeclass Solution {public: int maxProfit(vector<int>& prices) { // write code here? int ans = 0, mn = prices[0];

2020-11-26 19:35:45 112

原创 牛课题霸--数组中只出现一次的数字

数组中只出现一次的数字题目链接Solution只有两个数字出现了1次,其他数字都出现两次。所以定义一个map,记录每个数字出现的次数。最后扫一遍数组,找出只出现一次的数字即可。Codeclass Solution {public: void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { ap<int,int>mp; bool fir = 0;

2020-11-25 22:11:22 66

原创 牛客题霸--两数之和

两数之和题目链接Solution寻找两个数,使它们的和等于所给的值。因为数据范围较小,所以可以直接枚举两个数,求和计算比较即可。Codeclass Solution {public: vector<int> twoSum(vector<int>& numbers, int target) { // write code here vector<int> ans; for (int i = 0;

2020-11-25 22:05:34 147

原创 牛课题霸--合并两个有序的数组

合并两个有序的数组题目链接Solution因为AB都是有序的,所以定义两个指针,从前往后依次比较当前元素,小的加入到新的队列中,然后指针右移。类似归并排序中的归并操作。class Solution {public: void merge(int A[], int m, int B[], int n) { vector<int> C; int i = 0, j = 0; while (i < m && j &

2020-11-25 22:02:25 74

原创 牛客题霸--括号序列题解

括号序列题目连接Solution判断一个括号序列是否合法。用一个栈来判断,如果是左括号就加入到栈顶,如果是右括号就看一下这个括号能不能和栈顶的左括号匹配。最后特判一下,如果栈没有空,说明左括号的数量多,也是不合法的。class Solution {public: stack<char> st; bool isValid(string s) { for (int i = 0; i < (int)s.size() ; ++i) {

2020-11-25 21:58:12 117

原创 牛客题霸--跳台阶题解

跳台阶题目链接Solution每次可以跳上1级台阶,也可以跳上2级。求跳到n级的台阶总共有多少种跳法。dp可以解决此类计数问题。设f[i]表示到第i层台阶的方案数,显然f1=1f_1 = 1f1​=1, f2=2f_2 = 2f2​=2;有递推式:f[n]=fn−1+fn−2f[n] = f_{n - 1} + f_{n-2}f[n]=fn−1​+fn−2​所以O(n)O(n)O(n)递推一下即可。class Solution {public: int jumpFloor(int

2020-11-25 21:51:37 139

原创 牛客题霸--二分查找题解

二分查找题目链接Solution查找数组中第一个大于等于查找值的位置,显然可以二分法做。因为数组是有序的,所以选取中间的位置,然后判断是否比要找的数大。如果中间的数大于这个数,显然答案在左边,否则在右边。每次将区间长度缩小一半,故复杂度是log2Nlog_2Nlog2​N。Codeclass Solution {public: int upper_bound_(int n, int v, vector<int>& a) { int L = 0, R

2020-11-25 21:31:36 104

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除