![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法编程
文章平均质量分 69
KDLin
这个作者很懒,什么都没留下…
展开
-
动态规划,博弈石头游戏系列
博弈游戏石头游戏由两人分别取石头,假定二人每次都是最优策略,在一定的规则下,求最终结果的一类题目。这类题目体现了动态规划的特点:本质上是暴力求解所有子问题,但是不重复需要良好的dp定义,保证子问题不重叠框架这是一种通用的博弈游戏的套路。虽然效率比较低。 int[][][] memo; int[] dp(int i, int j, int[] piles) { if (j <= i) return memo[i][j]; if (memo原创 2021-02-21 08:34:53 · 404 阅读 · 0 评论 -
动态规划,买股票系列
买股票系列有限状态机。一种区别与序列dp定义的动态规划定义方法。通用框架int n = prices.length, K = k;int memo[][][] = new int[n + 1][K + 1][2];for (int i = 0; i <= n; i++) memo[i][0][1] = Integer.MIN_VALUE;for (int i = 0; i <= K; i++) memo[0][i][1] = Integer.MIN_VALUE;for (int原创 2021-02-21 08:34:06 · 192 阅读 · 0 评论 -
887高楼扔鸡蛋
877 高楼抛鸡蛋问题这是一道经典的题目。有多种解决方法,而且题目本身非常抽象,即使case很少也不好理解。例如你基本上很难想明白2个鸡蛋6层楼,需要扔多少次。这个问题是有最优解的,即对于任意k个鸡蛋,n层,必定存在一种最优方案,使得测试次数达到最少,该方案可以规定每个测试的测试点(解法二可以更好体现这一点)。这个问题有很多种解,部分解非常精巧但是意义并不是很大。解法一,动态规划,非常直观的一种解法,也非常重要。其中很有意思的就是二分搜索的优化,以及对于max,min的复合优化目标的分析——使用图原创 2021-02-16 19:32:10 · 186 阅读 · 0 评论 -
92翻转链表
92. Reverse Linked List II翻转链表。https://leetcode.com/problems/reverse-linked-list-ii/思路很简单,难点在于实现细节。v1迭代实现前后指针,遍历翻转,难点是细节控制。为了一致性,在头部添加了哨兵节点,减少了很多判断。复杂度时间复杂度显然为O(m),一次遍历解决问题。空间消耗为O(1)public class Solution { public ListNode reverseBetween(ListNo原创 2021-02-07 08:16:10 · 96 阅读 · 0 评论 -
295寻找流的中位数
1. 问题分析Find Median from Data Stream维护流数据的中值https://leetcode.com/problems/find-median-from-data-stream/中值问题,原本的中值问题,由于只需要局部有序,即使满足mid前面都小于mid,mid后都大于mid即可,因此可以采用递归partition的方法来得到O(log N)的解法。但本问题是流问题,数据实时读入,实时找中值。问题的核心是:有序性,这样才能方便地找中值例如有序数组原创 2021-02-07 08:15:07 · 140 阅读 · 0 评论 -
回溯法,子集选择合集
框架回溯的核心特征,做选择。回溯主要基于递归,它的特点是选择以及撤销选择,非常经典。子问题性质不是很明显。算法复杂度可以从子集数考虑,空间复杂度则一般为递归深度N。回溯法框架如下:result = []def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: 剪枝 做选择 backtrack(路径, 选择列表)原创 2021-02-07 08:14:40 · 279 阅读 · 0 评论 -
q25按组翻转链表
25. Reverse Nodes in k-Group按组翻转链表https://leetcode.com/problems/reverse-nodes-in-k-group/v1迭代实现,连接细节。public class Solution { public ListNode reverseKGroup(ListNode head, int k) { ListNode b, pre, cur, start, end, t;int i; b = new L原创 2021-02-07 08:14:02 · 83 阅读 · 0 评论 -
q234回文判断
234. Palindrome Linked List空间复杂度O(1)的回文判断,简单题快慢指针求链表中值有用。/*其实就是逆转链表技巧,快慢指针,取中间值Runtime: 1 ms, faster than 95.82% of Java online submissions for Palindrome Linked List. Memory Usage: 42.1 MB, less than 49.84% of Java online submissions for Pal原创 2021-02-07 08:13:27 · 303 阅读 · 0 评论 -
滑动窗口集合
概述一种非常典型的编程思想,滑动窗口。专门针对滑动窗口的问题,框架更是一看就懂。while (right < s.length()) { //移动窗口右边时机,向窗口添加元素 w.add(s.charAt(right++)); // 判断是否需要移动窗口坐标,移除元素 while (w.check()) { w.remove(s.charAt(left++)); } // debug时机,查看当前窗口,或打印窗口内容 //原创 2021-02-07 08:12:52 · 209 阅读 · 0 评论 -
动态规划专题,字串的套路合集
概述经典的子序列问题。一些体会很多问题可以轻易想到子集数的解法。动态规划的重要特征之一,求最值。常见的解法dp(i) 类型一维memo解决常见以nums[i]结尾的如何如何需要考虑当前状态需不需要遍历前面的所有元素,因而复杂度可能为O(N^2)dp(i, j) 类型二维memo常见s[i:j]的最xx值为多少迭代需要考虑遍历方式时间复杂度空间复杂度通常为O(N^2)可以使用状态压缩遍历方式对角线遍历:for (int k = 1原创 2021-02-07 07:50:48 · 179 阅读 · 0 评论 -
计算完全二叉树的树高
计算完全二叉树的树高思路:要求在低于O(N)的时间复杂度内解决问题由于任务是累加,每个递归中都是O(1),所以很自然地,树的节点统计必然也是至少和节点数量一样O(N) —— 至少要遍历一遍吧但是完全二叉树,满二叉树,complete二叉树由于其特殊的性质,使得你可以不必遍历的情况下,从树高得知到部分或全部的节点数量,这就是优化的key point计算二叉树的节点数量很简单树节点数量 = 左子树数量 + 右子树数量 + 1,看起来似乎要遍历左右子树,但由于完全二叉树的特点,其实左右必然有一棵树是满原创 2021-01-09 22:19:40 · 3115 阅读 · 0 评论 -
236. 节点的最小公共祖先获取
236. Lowest Common Ancestor of a Binary Tree节点的最小公共祖先获取,后序遍历的进阶使用。https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/v1符合直觉的做法。思想是遍历记录父亲和树高,通过对比树高,分别向上查找父亲时间复杂度:trav : O(N) * O(hash),O(hash)期望为O(1),所以事实上该操作的算法复杂度为O(N)findLCA: O(H原创 2021-01-09 22:18:24 · 166 阅读 · 0 评论 -
341. 无限嵌套列表迭代器实现
341. Flatten Nested List Iterator无限制嵌套列表的迭代器。https://leetcode.com/problems/flatten-nested-list-iterator/迭代器设计模式[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d85vwZBA-1610201846915)(…/assets/img/image-20210107181315002.png)]自底向上:容器内部保存一个迭代器,专门用于遍历容器。自顶向下:原创 2021-01-09 22:17:48 · 128 阅读 · 0 评论 -
98. bst合法性检查,看起来简单问题
98. Validate Binary Search Treebst合法性检查,返回true or false。对于BST的合法性检查并没有看上去那么简单。BST的约束——左子树都小于cur,右子树都大于cur。这个约束并没有看上去那么简单,事实上对于每个节点来说它对左子树的要求是,必须限制在一个范围内 min < all in left < cur.val,这个min并不是什么时候都存在,只有在当前节点是父节点的右子树时,它的mean来自于父节点的cur.val他对右子树的要求是,必原创 2021-01-09 22:16:53 · 452 阅读 · 0 评论 -
538. bst遍历求累加和
538. Convert BST to Greater Treebst遍历求累加和复杂度时间复杂度是O(N),准确来说是O(H+N)->O(2N),H是树高,因为在开始遍历节点之前,必须到达叶子节点。空间复杂度是O(H),入栈节点最高等于Hv1 回溯/** Runtime: 3 ms, faster than 93.00% of Java online submissions for Convert BST to Greater Tree.* Memory Usage: 39.2原创 2021-01-09 22:15:14 · 171 阅读 · 0 评论 -
652. 重复子树查找,一些python的奇巧淫技
652. Find Duplicate Subtrees给定root,查找树内的重复子树,返回所有重复子树列表,列表去重一些有意思的东西一个问题引出了很多有意思的东西。元组序列化,python中可以方便使用的技巧,和string序列化互补 性能测试,timeit工具包 对象编号,借用dict工具对复杂对象编号,常用的技巧 defaultdict的使用,一个好用的字典 frozenset和tuple的hash原理,前者是缓存了hash,后者是计算,和元素的内容有关,无缓存v 1.原创 2021-01-09 22:14:08 · 251 阅读 · 0 评论 -
后序+中序(前序+中序)重构树,严格O(N)算法
105/106. Construct Binary Tree from Inorder and Postorder(Preorder) Traversal根据前序,中序或者后序,中序重构树。这里仅以后序+中序进行分析。文末给出前序的类似代码,原理一致。Notes递归的难点在于递归函数的正确定义理解定义再理解代码非常简单,尤其是二叉树,对于左子树的递归,正确的理解是,左子树任务已经完成了,我需要做什么设计递归函数,可以从基元考虑(没有子节点,边界节点)和普遍情况考虑(即左子节点全部完成,右子节点全原创 2021-01-03 07:54:04 · 146 阅读 · 0 评论 -
动态框架方法论
动态规划2020年12月29日14:06 目录 - - 经典三概念与解决思想 - 经典的解决思想 - 动态规划的方法论 - 案例:找零 - 求解框架 - REF 经典三概念与解决思想动态规划是什么?动态规划有三个特征。重复子问题,这个特点很好理解,递归树是一个非常好方法,它的一个功能就是能直观地感受到重复子问题 最优子结构,当前问题可以由子问题的solution解决,这个特性,...原创 2021-01-03 07:52:12 · 292 阅读 · 1 评论 -
654. Maximum Binary Tree,一种严格O(N)的解法以及证明解析
654. Maximum Binary Tree最大值二叉树重构。Version 1递归解法。每次以当前nums中最大值创建当前节点,递归重构左子树,右子树。时间,最坏情况下,二叉树变为链表,算法复杂度O(N2)O(N^2)O(N2),通常情况下,二叉树比较均衡我们期待高度为logn,因而算法复杂度为O(N⋅logN)O(N\cdot logN)O(N⋅logN)空间,维护nums和树,O(N)O(N)O(N)# version 1# Runtime: 492 ms, faster tha原创 2021-01-02 09:59:03 · 146 阅读 · 1 评论 -
红黑树,它只是一棵规则多的平衡树
红黑树2020年12月14日22:19概述红黑树是一种平衡二叉树,它的构建必须遵守红黑树的原则,由此来保证平衡性(事实上是黑色节点平衡)。红黑树的核心操作是旋转和染色,通过二者来自平衡。所以本质上它就是一种非常类似AVL树的二叉搜索树,类似的结构有B-Tree,B+Tree,都是遵守规则加上旋转达到自平衡。插入和删除其实本质上类似,都是改变-自平衡,但是删除的规则列表极多。红黑树的实现困难来源于需要考虑的case太多,但并不复杂。以下是红黑树的核心:空节点视为黑色,可以保持.原创 2020-12-17 10:03:34 · 594 阅读 · 0 评论 -
A*算法,简单实现八数码问题
A星算法的学习,我觉得是个非常有意思的算法,但我没有特别多的精力,这篇文章仅仅是个人理解,代码也写得比较丑,莫要参考原创 2020-05-08 14:19:53 · 9293 阅读 · 1 评论 -
c1: Day of Week
日期类问题星期相关, 使用通用思路#include<cstdio>#include<string>#include<iostream>#include<map>using namespace std;int mTD[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };char week[7][...原创 2019-01-09 23:12:22 · 136 阅读 · 0 评论 -
c1: 日期差值, 实现二
日期类问题回避细节, 预处理, 通用方法#include<cstdio>using namespace std;int mTD[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };bool isLeapYear(int y) { return (y % 100 != 0 && y % 4 == 0) || y % 400...原创 2019-01-09 23:11:00 · 97 阅读 · 0 评论 -
c1: 日期差值
日期类题目一, 简单题直接模拟, 需要细节控制using namespace std;int mTD[]={0,31,28,31,30,31,30,31,31,30,31,30,31};struct Date{ int y,m,d;};bool isLeapYear(int y){return (y%100!=0&&y%4==0)||y%400==0;}int g...原创 2019-01-09 23:09:37 · 114 阅读 · 0 评论 -
c1: 成绩排序
简单题#include<iostream>#include<algorithm>#include<cstring>using namespace std;#define MAXN 1000+5struct student{ char name[101]; int age; int score;}stus[MAXN];bool cmp(stu...原创 2019-01-09 23:07:45 · 178 阅读 · 0 评论 -
c1: 日期类练习题x2
同样使用预处理, 通用方法打印日期#include<cstdio>using namespace std;int mTD[]={0,31,28,31,30,31,30,31,31,30,31,30,31};struct Date{ int y,m,d;};bool isLeapYear(int y){return (y%100!=0&&y%4==0)|...原创 2019-01-09 23:14:39 · 158 阅读 · 0 评论 -
c3: 括号匹配问题
栈的基本使用#include<cstdio>#include<stack>using namespace std;char str[101];char ans[101];stack <int>s;int main(){ while(~scanf("%s",str)){ for(int i = 0; str[i]!=0; ++i){//字符串...原创 2019-01-28 14:07:29 · 99 阅读 · 0 评论 -
【c3】二叉排序树
看注释#include<cstdio>using namespace std;/*需要注意的问题有两个,第一是newNode重置好,否则多次利用内存池中节点会溢出第二是insert的时候需要忽略重复节点 */ const int MAXN = 105;struct Node{ int val; Node *l,*r;}buf[MAXN];int i =0;N...原创 2019-02-02 16:27:13 · 136 阅读 · 0 评论 -
c3, 题目:简单的计算器【栈应用,表达式求值】
栈的经典应用, 表达式求值和逆波兰表达式求取, 思路相同.题目比较简单, 但是具体而言细节是很多的, 题目可以取巧, 因为只涉及到±*/两种优先级, 所以可以直接处理. 不必使用表达式求值的思路, 但是这个思路更加泛用.具体而言细节还是很多的, 比如哨兵的加入. 另外就是拓展的话优先级矩阵需要改进. 编程其实就是分解, 编写的过程. 像这道题, 思路其实很简单.栈表达式求值的思路, 可以参...原创 2019-01-28 21:26:16 · 380 阅读 · 0 评论 -
【c4】特殊乘法
全是水题版本1#include<cstdio>#include<stack>#include<cstring>using namespace std;char a[15],b[15];int ans;int main(){ while(~scanf("%s %s",a,b)){ ans = 0; for(int i = 0; a[i] ...原创 2019-02-05 17:59:40 · 245 阅读 · 0 评论 -
【c3】二叉树应用题x4
题目:二叉树遍历二叉树重构基本问题#include<cstdio>#include<cstring>using namespace std;const int MAXN = 29;struct Node{ char val; Node *l,*r;};char pre[MAXN],in[MAXN];void postOrder(Node *root){...原创 2019-01-30 16:56:35 · 291 阅读 · 0 评论 -
c1:排序
机试真题, 简单题.#include<cstdio>#include<algorithm>using namespace std;//const int MAXN=100+5;#define MAXN 100+5int arr[MAXN];void output(int arr[],int n){ for(int i = 0; i < n; ++i)p...原创 2019-01-09 23:05:59 · 127 阅读 · 0 评论