20210712一周总结

剑指offer刷题总结 第一周

重点总结

快排 头插法 树的遍历7种 二分法

分题总结

JZ1 沿对角线递增的二维数组的查找 常规解法 逐行进行二分查找 时间复杂度O(MlogN) 有序数列的查找首先考虑二分法
JZ2 string的扩容类似vector 会使迭代器的地址发生改变 处理字符串时多采用数组下标访问进行操作
string的一些函数

string(const string & str,size_t pose,size_t count)
string(size_t count,char ch)
string::append(size_t count,char ch)
string::appendconst string& str) 
string::append(const string & str,size_t pos,size_t count = npos)
string::append(T::const_iterator first,t::const_iterator last)
string::substr( size_t pose,size_t count = npos)

形参顺序:str对象->pos->count->char内容
JZ3 递归和栈在多数情况下可以互相转换
JZ4 根据前序和中序遍历可以还原一整颗树 树的三种遍历(递归+迭代)+层次遍历待掌握
JZ5 用栈实现队列 用到了缓冲的思想 为保证出栈s1后的元素能与之后入栈元素相对位置不变 当s2空时 将s1整个换到s2中 s2相当于一个缓冲区 其中元素永远不会回到s1中
JZ6 二分查找的思路 判断条件有所变化
JZ7~8是fibonacci问题 而JZ10是fibonacci的变形 f(1)=1; f(2)=2; f(3)=3; f(n)=f(n-1)+f(n-2) 这是经典的递归问题 但JZ9复杂跳台阶并不是 当f(n)等于n-1到1所有情况相加时 f(n) = 2f(n-1) 这种应用题有很多种解法 用公式推导也很有趣
JZ11 二进制位移操作>>会比除法/2效率 负数C++中表示为补码形式(原码取反+1) 负数的右移会在左端加1 所以此题可以按位与1相与&来判断该位是否为1 可以采用1<<的方法从右向左遍历 这样避免了负数右移无限循环的问题 同时还有通过n&(n-1)的消去最右面的一个1 循环统计1的个数 很巧妙
JZ12 可以把幂次二进制分解 每次exponent>>1 系数ret也跟着pow2 若exponent&1base*= retret表示幂数在二进制表示中第n位分解出的pow(base, n)
JZ13 对时间有限制 用辅助vector将原vector拆分出奇偶两部分 再拼接在一起 若需要空间复杂度O(1) 可采用类似冒泡的思路
JZ14 可以用双指针做 也可以用栈或递归去做 都不难
JZ15 标准头插法
JZ16 揪面团 把两个面团揪成另一个面团 所以过程中有三条链表
JZ17 要判断树的子结构 遍历+递归 而不是遍历x递归 依次遍历树的每个节点 若与小树root值相等 则递归比较子树
JZ19 可以用递归或者迭代 坐标移动的位置与圈数有直接联系 每次递归绕一个圈 处理好最后剩下的圆心位置即可
JZ25 双层循环找到每个节点对random节点的映射关系 存在pair<Node*,count>里 random可以通过计数记录map的相对位置 还原的时候再通过修正map中每个节点的random值使它们指向相对的node
JZ28 sort然后找中间数 或者设count同则++ 不同- - count==0替换 最后做一次判断
JZ29 可以用k次简单选择或者冒泡排序 复杂度O(k*n) 也可用快排判断返回位置与k的关系来求
JZ32 将数字转化为stringto_string(nums) 存入vector<string> vs设计比较函数static bool cmp(const string s1,const string s2) return s1+s2<s2+s1 通过sort(vs.begin(),vs.end(),cmp) 就将vs中的数字排序成了题目要求的顺序 再拼接在一起就好了
JZ35 归并的思路 动态规划的思想 局部最优解
JZ36 a+b = b+a 判定条件while(p1!=p2)很巧妙
JZ37 两次二分查找 通过判定条件的更改 找到左右边界
JZ42 1.暴力解法 将所有数存在hashmap里 遍历一次利用hash中find时间复杂度O(1)的特点 总的时间复杂度O(n) 2.双指针 一前一后找到的第一对就是乘积最小的一对
JZ50 找重复可以用set.insert() 返回一个pair<iterator,bool> 判断bool的值 找出插入失败的iterator 就是重复的元素
JZ51 动态规划 M[i] = M[i-1]*A[i-1] N[i] = N[i+1]*A[i+1] B[i] = M[i]*N[i]
JZ52 考虑a*所表示的三种情况 遍历即可
JZ53 条件比较复杂 但不难
JZ55 快慢指针判断是否有环 之后有两种方法 算出环长再用快慢指针 或者a = n(b+c) + c让两指针相遇
JZ56 遍历 设pre cur 两个指针
JZ57 暴力解法 中序递归存在vector中 直接找下一个 迭代解法 根据中序遍历判定条件直接求解
JZ65 遍历M*N 设置辅助vector存放是否访问过的bool 每个节点进行DFS 注意撞墙
JZ66 同上 判定条件有所改变
JZ67 动态规划 长度大于等于5才有剪的必要2*3>5 剪成3*(n-1)+rest 注意处理rest的不同情况(rest=则最后一刀不用剪4>1*3)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值