摘要:
滑动窗口经典例题,从首尾选择元素; 之前自己的想法是直接对比首尾元素,直接求和就行,但是存在误区; 例如以下序列: 1,2,100,99,5,1; 如果选取三个数字,会选择1,5,2三个数字,但是应该选取1,5,99; 当然可以采用递归dfs,但是会存在爆栈问题; 当然也可以采用记忆法剪枝,但是还是 阅读全文
摘要:
总体来说就是递归的树形求解,DFS的一种; 【回溯分割回文子串,可用dp辅助】 阅读全文
摘要:
之前想用回溯递归树怕爆栈,没想到真的可以。。。。 主体思想还是利用枚举当前前缀子串进行判定,如果是回文子串则进行后缀的下一次递归判定,如果不是回文子串,放弃当前枚举前缀,重新选取一个前缀; 如果采用dp进行回文子串的事先判定可能更快一点; 采用单纯回溯判定: class Solution { pub 阅读全文
摘要:
滑动窗口月简单题,没什么好说的,标记遍历对比即可; class Solution { public: double findMaxAverage(vector<int>& nums, int k) { double maxn = 0; int now = 0; for (int i = 0; i < 阅读全文
摘要:
滑动窗口月的Hard题,目前有两种解决的主流方案: 1.使用两个堆,一个大顶一个小顶,来计算平均值,C++使用的是priority_queue,即两个优先队列; 2.使用可自己调节的平衡二叉树,把时间和复杂度控制一定范围内,C++给出的是multiset; 针对于维护两个堆的思想: 建立两个堆,分别 阅读全文
摘要:
做一下滑动窗口的总结问题,后续遇到题目会更新在此篇中; 滑动窗口本质上就是通过维护left和right两个指针,进行子序列的判定,通过不同的判定条件来决定left和right的右移; 在字符串问题中见的比较多; 例如,对于最长重复字符串的解决: 虽然该问题可以通过dp解决,但是还可以解决dp不能解决 阅读全文
摘要:
双指针的另一用法,用于解决3sum问题; 时间复杂度位O(n2),有点高; 主题思想: 先进行排序,以减去相同元素的不同组合情况; 设立第一个指针,从前到后遍历; 对于后续区间进行左右两个指针向中间双向遍历,加和三个元素; 乍一看像是三次方复杂度,其实除去第一层,剩下的是On复杂度; class S 阅读全文
摘要:
之前排列组合相关的问题通常直接采用递归来解决,从来没有深究过背后的思想; 递归和回溯问题主要是采用树的思想; 组合问题: 组合问题常常是给出n个元素,从中间选定k个元素,进行组合,有时还需要无重复组合; 所以根据遍历树的思想,可以认为是一个k层树,进行遍历即可; 例如上图所示: 递归嵌套为两层,直接 阅读全文
摘要:
回溯树的问题,和之前的递归思想相同,但是从来没有做过相关总结; 总体来说,通过一个一个递归来进行枚举,每次传入flag标志数组进行记录,进行重复元素剔除,太久没刷有点没感觉; void find(vector<bool>& flag, vector<int>& mem, int x, int cou 阅读全文
摘要:
困难题,没有想到并查集的思想,并且很久不做有点生疏; 以前并查集都是针对于单个目标的次序排列问题,头一次遇到这种归类问题; 基础思想是判断两个字符串是否属于一类,但是这一个问题也蕴含了次序的问题; 例如,a,b,c; 有可能a,b相似,b,c相似,而a,c不相似; 也有可能a,c相似,b,c相似,a 阅读全文