其他代码:
- 螺旋打印,倾斜打印数组
- 矩阵乘法
- O(1)空间判断整数是否为回文数字 (负数;直接翻转会溢出) => 思路具体如何取? 取最高位,最低位后; 在删除最高位最低位
- 矩形中1的个数(连通集 & 正方形分别如何做?)
- 打印所有的子集
- 买卖股票 1次?dp[i]当前位置的最小值 dp[i] = dp[i-1] or prices[i]
- 买卖股票 多次?当前为止的最大利润 dp[i] = dp[i-1]+prices[i]-prices[i-1] or dp[i-1]
- 买卖股票 dp[k, i] = max(dp[k, i-1], prices[i] - prices[j] + dp[k-1, j-1]), j=[0…i-1]
第K手交易的= 不做交易的前一天的收益; 在[0,i-1]天中的某一个收益上增加一手交易
- 最长公共子序列 dp[i][j] = std::max(dp[i-1][j], dp[i][j-1])
- 最长上升子序列 两个for循环,dp[i]=max{1,dp[j]+1},遍历j<i情况
- 大数乘法???
- 最长不重复的连续子串 (slow,fast之间是不重复的区间 + fast:遇到之前出现过的字符,则移动slow到此字符出现的位置 思考:如何实现的?开辟256大小的空间存储value-index对)
- 位运算: 只出现1次,其他出现2次 (数组内逐元素异或)
- 位运算: 两个数字出现1次,其他出现两次 (1.寻找逐元素异或,寻找为1的index 2.划分数组后转化为问题12)
- 位运算: 只出现1次,其它出现3次 (二进制每一位统计1的个数 % 3, 余数即为所求)
- 位运算: 只出现2次,其他出现1次 ?(1~100的数字,有一个出现2次。 异或1~100自己异或 ^ 包含101个数字的数组异或 || 1.hash表 || 2.sum求和 )
- 位运算: 不使用加减法做加法? 剑指offer 47
- 位运算: 数字中1的个数 思路: 1.考虑正负数 2.最优解法:
-
while(K){ //每次把K的最右侧第一个1置位0
++count;
K = K & (K-1);
} -
二叉树判断问题:
- 对称树 辅助函数,helper(left->left,right->right) && helper(left->right,right->left);
- 平衡二叉树 1.辅助函数计算树深 2.或者类似后续遍历的递归写法 left递归,right递归,判断left-right的差值,return max(left,right)+1
- 子树 1.helper先判断两个树是否相同 2.原函数递归判断A->left,B || A->right,B
- 二叉树的创建问题:
- 镜像树
- 前序遍历带# 类似于前序遍历的流程,TreeNode* build(vector&arr,int& index)
- 前序&中序
- 二叉树的路径问题:
- 最大深度 4行
- 最大直径 类似后续遍历,root节点处理左右子树和
- 路径和 pathSum(TreeNode* root, int target, vector&path,vector<vector>& ans)
- 最近公共父节点
- 二叉搜索树问题:
- 二叉搜索树的最近公共父节点 参数: TreeNode* root,p,q
- 第K小的值
- 每一个节点的val修改为所有大于其的和
-
两个数组交集(有序:归并排序 无序:hashmap,另一个数组做查找)
-
二分查找(
1.开平方while(|mid^2-target|>ξ)
2.有序数组第一个等于K的值,最后一个等于K的值 等于K的判断条件放在while(low<=high)最后
3.有序数组第一个大于等于K的值
4.旋转数组寻找旋转点,寻找K值
5.二分法: 牛顿迭代法:while(xn^2-num>ξ) {xn+1 = xn - f(xn)/f’(xn)} 其中:f(xn)=x^2-2
6.牛顿法 ==> f(xn+1) = f(xn) + f’(xn)*(xn+1 - xn) = 0 -
满二叉树(节点是满的),完全二叉树(最后一层空缺,只能空缺在右边)==>完全二叉树的最后一个节点
-
二叉树中序遍历的下一个节点(有指向父节点的指针); 二叉树的叶子节点的公共父节点
-
后缀数组 字符串中子串出现最多的次数 ???
-
寻找明星的策略(群众之间的关系未知,智力题 去看BAT100题)
-
图的最短路径算法
1)Floyd算法
邻接矩阵=i,j的最短距离
第一重for循环遍历中间节点K∈(0,N); 两重循环更新edge[i][j]>如果可达,更新Edge[i][j]=min(self,edge[i][k]+edge[k][j])
2)Dijkstra算法
加权无向图
单源最短路径,邻接链表
mark[] 表示节点是否存在于s的最短路径集合中; marktrue,dist[]是最短路径。 否则 distp[i]表示s经过集合某个元素K再到达i的距离
1.遍历n-1个顶点 2.空集加入start节点 3.从所有不在集合中的节点,选择dist[]最短距离的newP
2.S可达的最短路径集合中新加入的newP,更新其newP的邻接链表 可达点的dist[];
3)Bellman-Ford
加权(可负)有向图
任意顺序放松有向图的所有边,重复V(顶点个数)轮
4)拓扑排序
无权重的有向图,不断删除入度为0的顶点。节点没删除完但是找不到入度为0时,存在环路 -
划分物品使得重量最相近(背包问题)
-
数据流的中位数 (最大堆 最小堆的堆顶保存中位数或者中位数两侧值)
-
二叉树: 路径和&路径II pathSum(root,sum,path,ans) 注意加入ans的判断位置;
-
二叉树: 两个节点的最远距离 == 树的直径 helper(TreeNode* root, int& diameter) diameter = std::max(diameter, ld+rd)
-
长度L的绳子最多覆盖坐标轴上多少点? fast,slow指针 (fast-slow<=L max_count,fast++;)否则slow++
-
字符串中最长的数字字符串 (DP? dp[i]=dp[i-1]+1 / 0)
-
堆排序的流程
-
数组旋转(先旋转给定点前K个元素 + 在旋转后面n-k个 + 再做整体旋转)
-
旋转的数组二分查找给定target
-
数组和等于目标值 hashmap
- int整数交换一次,使得数字尽可能最大(思路: 寻找递减区间的分界线 + 从分界线的右侧寻找"max" +分界线左边寻找小于"max"的最大值+ 交换)
/ BFS DFS
34. 小岛数量? (DFSHelper何时跳出循环? 传入哪些参数?) DFSMarking(vector<vector>& grid, int i, int j)