09 2022 档案
摘要:感觉很简单的一道题,curnum存下连续数组和大于0的数值,maxnum存下最大连续数组和,curnum从数组头开始,遍历数组,+= 数组值,当curnum大于0时,那么即便紧接着的后面有一个很大的数组和,但是加上curnum会更大,但是curnum小于0的时候,会损害后面的数组和,所以curnum
阅读全文
摘要:贪心:选三个最长的边组成三角形,如果最长的三个边不能组成,那么这时候无论把第二和第三大的边换成什么都不可能能够和最大的边组成三角形,这时候就必须把最大的边给换掉,把最大的边提出考虑范围,这时候第二大的边就变成了最大的边。以此往复,最后选到合适的三条边,这时这三条边的和就是能组成三角形的最大周长。 #
阅读全文
摘要:我写的并不好,力扣上有比这更好的方法 我的思路:从头遍历数组,检查位置是否能放下花,能放就放下,然后检查下一个位置,注意放下之后就改变了数组。然后就是注意前后数组越界,注意数组只有一个数时的情况。 #include<iostream> #include<bits/stdc++.h> #include
阅读全文
摘要:贪心:把 9 换成 6 是不可能的,只有把 6 换成 9,而且要换就换最高位的那个 6 C++: to_string 可以将整数转化为 string 类型,stoi 可以将 string 转化为 int 类型,这个好用! #include<iostream> #include<bits/stdc++
阅读全文
摘要:力扣也有这道题,但是力扣做的很快,碰到有输入输出的题目就感觉我在做两道题目,一道是如何输入两行,每行是一个不定长的数组元素,最后在代码中转为数组,c++不好做,c的话可能就更难了。另一道是贪心的题目,这里有个很重要的,就是每个孩子只能吃一个饼干,那么就只需要先将两个数组排序,从胃口最小的孩子开始,让
阅读全文
摘要:采用递归遍历所有可能性,再使用剪枝减小运行时间,利用回溯,代码有注释 #include<iostream> #include<bits/stdc++.h> #include<cstdio> #include<string> using namespace std; vector<vector<int
阅读全文
摘要:维持左右两个指针,可以知道,当左边比右边低的时候,移动右边的指针往左边靠近,即便指针指向一个更高的高度,能装的水也只会减少,因为底边减小,但是木桶原理,最低高度不变,所以这时候应该移动左边的指针寻找高于右边的高度。 #include<iostream> #include<bits/stdc++.h>
阅读全文
摘要:分支树的思想遍历所有可能性,然后加上限制条件,剪枝掉不符合条件的分支,比如只能选出k个数进行组合,那么curk==k时结束这个分支,还有就是注意边界的问题,curn>n。 #include<iostream> #include<bits/stdc++.h> #include<cstdio> #inc
阅读全文
摘要:具有阶段性的问题可以采用回溯的方法,选择深度遍历的方法将所有的可能性遍历出来,在这过程中去掉一些不可能的分支。 #include<iostream> #include<bits/stdc++.h> #include<cstdio> using namespace std; int n; vector
阅读全文
摘要:求出字符每个出现的个数,出现一对就回文串大小加2,出现落单的一个就存起来。计算完所有一对的字符之后,如果之前有保存有落单的字符,那么最后的回文串大小加1,得到最大回文串的长度。 #include<iostream> #include<bits/stdc++.h> #include<cstdio> u
阅读全文
摘要:用单调栈的想法,最先进栈的肯定比最后进栈的小。 贪心的话就是确保第一个数是最小的就可以确保整个数是最小的。比如:200>100 最后做一个出栈处理,保证数值最后输出是200,不是0200,还有就是如果栈里面什么都没有即所有位的数值都被消去的话,要输出0。 #include<iostream> #in
阅读全文
摘要:动态规划的想法就是之前的状态是已经算好所有的回文子串了,然后多了一个字符,就把之前所有和最后的字符连接在一起的回文子串的前一个字符和新字符对比,如果一样,那么构成新的回文子串。 比如:babaa+b, 之前的连接到最后字符的回文子串有aa,a, aa前的b和新字符b一致,那么多了新回文子串baab。
阅读全文
摘要:01背包问题,每件物品都有放和不放这两种选择。 使用动态规划思想:有n件物品情况下的总价值最大背包和有n-1件物品情况下的总价值最大背包有关。 我也讲不大明白,对背包问题有兴趣的可以去这看看:https://zhuanlan.zhihu.com/p/93857890 #include<iostrea
阅读全文
摘要:动态规划当前状态和前一状态相关。到m阶楼梯的方法等于到m-1和m-2的方法相加 #include<iostream> #include<bits/stdc++.h> #include<cstdio> using namespace std; int n; int cnt[25]; int main(
阅读全文
摘要:要知道走到(m,n)有多少种方法,那就要知道走到前一步的位置有多少种方法,即将走到(m-1,n)和(m,n-1)的方法相加。 #include <iostream> #include <bits/stdc++.h> using namespace std; int nums[15][15]; int
阅读全文
摘要:动态规划当前状态和之前状态息息相关。比如这题:组成硬币,已经组成好的硬币x加上面值为y的硬币就可以组成好x+y的硬币。所以要算出组成x+y的硬币,就要先算出组成x的硬币。可以用循环从x=0开始计算。 #include <iostream> #include <bits/stdc++.h> using
阅读全文
摘要:多个判断,简单题 #include <iostream> #include <bits/stdc++.h> using namespace std; int bills[3]={0}; int main() { bool flag=true; while(1){ int ret; int bill;
阅读全文
摘要:采用归并算法,先将一个链表分成两个链表,分到不能再分,然后再将已经排好序的链表有序地归并起来。 主要问题:1. 一个子链表如何分成两个。2. 释放空间的问题(没有实现) #include<iostream> #include<bits/stdc++.h> #include<cstdio> using
阅读全文
摘要:先sort进行排序,然后输出第k大的元素即可 #include<iostream> #include<bits/stdc++.h> #include<cstdio> using namespace std; int n, k; int arr[10005]; int main() { scanf("
阅读全文
摘要:先sort排序,在输出最小的k个数。 #include<iostream> #include<bits/stdc++.h> #include<cstdio> using namespace std; int n, k; int arr[10005]; int main() { scanf("%d %
阅读全文
摘要:求最大子序列和: 如果前面的序列为正数,后面紧接着出现一个最大子序列,那这个最大子序列加上一个相邻的正数数列才会是最大子序列。 要注意如果全为负数,那么最小的那个负数就是最大的子序列和 #include<iostream> #include<bits/stdc++.h> #include<cstdi
阅读全文
摘要:都保证了有一个多数了,那就变成了求最多出现的那个数,因为数组中只有可能有一个多数。 #include<iostream> #include<bits/stdc++.h> #include<cstdio> using namespace std; int n; int a[10005]={0}; in
阅读全文
摘要:需要注意的: scanf()的返回值是 EOF,输入结束 通过指针指向左右子树的二叉树构建 #include<iostream> #include<bits/stdc++.h> #include<cstdio> using namespace std; struct node { int data;
阅读全文