随笔分类 - 数据结构与算法
摘要:维持左右两个指针,可以知道,当左边比右边低的时候,移动右边的指针往左边靠近,即便指针指向一个更高的高度,能装的水也只会减少,因为底边减小,但是木桶原理,最低高度不变,所以这时候应该移动左边的指针寻找高于右边的高度。 #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;
阅读全文
摘要:将阈值想象成水,安全系数想象成岛屿,从一开始阈值最低,慢慢升高,从低往高淹没岛屿,当岛屿的result为1,淹没扣分,result为0,淹没加分,寻找最佳阈值,使得分数最高。 需要注意的: 使用了结构体将result和y绑定在一起,易于之后的sort排序 sort自定义排序 淹没岛屿时要淹没所有相同
阅读全文
摘要:借用岛屿情况来分析这个题。考虑p足够大的情况,所有的数都被海水淹没了,只有 0 个岛屿。然后,海平面逐渐下降,岛屿数量出现变化。每当一个凸峰出现,岛屿数就会多一个;每当一个凹谷出现,原本相邻的两个岛屿就被这个凹谷连在一起了,岛屿数减少一个。使用数组cnt[],cnt[i] 表示海平面下降到i时,岛屿
阅读全文
摘要:差分性质:要给数组 Q 的第 a 个到 第 b 个数(从1开始的数组)加 k,那就 Q[a]+=k, Q[b+1]-=k。 最后再将 Q 求前缀和还原数组 : 遍历 Q[i] = Q[i] + Q[i-1] #include<iostream> #include<bits/stdc++.h> int
阅读全文

浙公网安备 33010602011771号