剑指offer
考前背一背
大灰狼吃树皮
这个作者很懒,什么都没留下…
展开
-
JZ10-矩形覆盖
动态规划:2n的覆盖方法数=2(n-1)的覆盖方法数量+2*(n-2)的覆盖方法数。因为2*(n-1)加一个竖着的,2*(n-2)加两个横着的,就是2*n。即当前状态由最后一个的不同状态转移而来。class Solution {public: int dp(int n){ if(n==0) return 0; if(n==1||n==2) return n; else return dp(n-1)+dp(n-2); } int r.原创 2021-05-24 22:36:23 · 74 阅读 · 0 评论 -
JZ9-变态跳台阶
最后返回的是pow(2,number-1);推到dp[i-1]=dp[i-1]+dp[i-2]+…+dp[1]+1dp[i]=dp[i-1]+dp[i-1]+dp[i-1]+dp[i-2]…+dp[1]+1=2*dp[i-1]。i>=2dp[1]=1;dp[2]=2;dp[i]=pow(2,i-1);class Solution {public: int jumpFloorII(int number) { return pow(2,number-1); .原创 2021-05-24 22:29:20 · 93 阅读 · 0 评论 -
2021-05-24
跳台阶:最后一次跳的方式是:跳1个台阶 or 跳2个台阶,将两种方式相加就是这次跳台阶的方法。class Solution {public: int jumpFloor(int number) { vector<int> dp(number+1,1); dp[1]=1; dp[2]=2; for(int i=2;i<=number;i++) dp[i]=dp[i-1]+dp[i-2]; .原创 2021-05-24 22:15:55 · 80 阅读 · 0 评论 -
JZ1-二维数组的查找
描述每一行递增,每一列递增。从右上角进行查找,如果当前值大于目标值,往左走,如果当前值小于目标值,往下走。核心:走的方向是两个顺序,也可以从左下角走。class Solution {public: bool Find(int target, vector<vector<int> > array) { int n=array.size(); int m=array[0].size(); int i=0,j=m-1; .原创 2021-05-24 20:49:20 · 85 阅读 · 0 评论 -
JZ2-替换空格
//遍历,如果遇到空格,执行s.replace(i,1,"%20");原创 2021-05-24 22:11:02 · 86 阅读 · 0 评论 -
JZ3-从尾到头打印链表
使用vector正序储存,倒序返回/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) :* val(x), next(NULL) {* }* };*/class Solution {public: vector<int> printListFromTailToHead(ListNode.原创 2021-05-24 21:09:54 · 76 阅读 · 0 评论 -
JZ4-重建二叉树
使用pre[l1]找到vin[index]得到左子树的数量left=index-l2,右子树的数量right=r2-index创建根节点,根节点的左子树=build(l1+1,l1+left,r1,index-1);根节点的右子树=build(l1+left+1,r1,index+1,r2);最后返回根节点/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; *..原创 2021-05-24 21:54:06 · 320 阅读 · 0 评论 -
JZ5-用两个栈实现队列
push时一直push到主栈pop时如果辅助栈为空,将主栈的元素push到辅助栈中,然后pop辅助栈中的元素。class Solution{public: stack<int> s1;//存储数据 stack<int> s2; void push(int node) { s1.push(node); } int pop() { if(s2.empty()){ if(s1.em..原创 2021-05-24 21:55:56 · 94 阅读 · 0 评论 -
JZ6-旋转数组的最小数字
旋转数组,二分查找,中间的数比右边的大,可以全部舍去左边的数;如果中间的数小于等于右边的树,可以舍去右边的一个数。核心思路:和右边界进行比较。核心代码while(left<right){ if(arr[mid]>arr[right])left=mid+1; else if(arr[mid]<=arr[right])right-=1;}return arr[left];整体代码class Solution {public: int minNumberInRot.原创 2021-05-24 22:02:01 · 132 阅读 · 0 评论 -
JZ7-斐波那契数列
定义:非递归,使用寄存器。状态转移:f(n)=f(n-1)+f(n-2);class Solution {public: int Fibonacci(int n) { if(n==0) return 0; if(n==1) return 1; int p0=0,p1=1,p2; for(int i=2;i<=n;i++){ p2=p1+p0; p0=p1; .原创 2021-05-24 22:09:04 · 109 阅读 · 0 评论 -
二叉树的序列化和反序列化
函数模型class Solution {public: char* Serialize(TreeNode *root) { } TreeNode* Deserialize(char *str) { }};关键点:序列化使用队列。反序列化使用vector创建结点,然后串起来。优先使用迭代法序列化:如果根节点是空,返回"# “。定义 ostringstream out;将根节点压入队列,一直循环到队列为空。在循环中,如原创 2021-05-19 11:39:19 · 99 阅读 · 0 评论