剑指offer刷题

Offer03:数组中重复数字

没看题解,只用了dict做哈希映射

 

Offer04:二维数组中的查找

方法1 左下角开始查找,比target大i--,比target小j++ (右上也可以)

方法2 二分法(暂时没看到易懂的,而且时间会长)

 

Offer05:替换空格

没看题解 join+split

 

Offer06:倒序打印链表

没看题解 递归

 

Offer07:重建二叉树

没看题解 递归 preorder[0]一定为根节点

 

Offer09:两个栈实现队列

看了提示,用一个栈去做另一个的倒序

题解优化,不做deleteHead的时候可以不倒序

 

Offer10:Fibonacci数列(青蛙跳台阶)

栽大跟头 动态规划需要加强--为传统的分治法节省大量冗余计算,用空间换时间

 

Offer11:旋转数组最小值

二分法寻找,递归的程序很慢,二分法是不是应该搭配指针routine,而不是递归

 

Offer12:矩阵中的路径

dfs的经典题目 递归+标记+剪枝

 

Offer13:机器人的运动范围

bfs/dfs 普通queue循环或者递归 做bfs时发现,通过已访问的set进行剪枝可以让程序提速很多,否则通不过

 

Offer14:剪绳子

纯数学推导:算数平均》几何平均 -- 等分带来最大积,对y=x^(1/x)进行求导 -- 以3等分最佳。最后考虑长度模3的三张情况以及特异解

DP:暴力递归的优化版本(添加记忆)

 

Offer16:数值的整数次方

二分法递归,发现一个有趣的事情。代码如果写成x**2会有overflow但是如果写成x*x就能通过。

 

Offer17:打印1到最大的n位数

进阶算法:转成字符串做dfs

 

Offer18:删除链表的节点

此题单双指针都可以用,复杂度为On。但如果target是链表的话,可以跳过搜索,直接暴力替换,复杂度为O1,但要注意尾部元素不能这么做,因为不能向函数内的链表直接接null(需要再查),所以会退化回On

 

Offer19:正则表达式匹配

回溯算法,需要重做

 

Offer20:判断表示数值的字符串

此题目用到有限状态自动机,涉及图算法。不会,需要重做

或者使用基础的逻辑判断法,设置三个met的bool,逐位考虑所有情况。

 

Offer21:调整奇偶数

利用快排思想的双指针(需要注意循环内顺序)

 

Offer22:链表中倒数第k个数

双指针避免查数过程

 

Offer24:反转链表

双指针方法简单,递归方法理解起来很难,在递归内貌似不能直接替换链表,需要手动temp替换

更新:递归内部时应注意让反转后的尾部接向None,防止循环递归

 

Offer25:合并有序链表

递归

 

Offer26:树的子结构

双递归,需要重做。明确终止条件

 

Offer27:镜像树

递归,平行赋值

 

Offer28:对称树判断

递归,需要重做

 

Offer29:顺时针打印矩阵

我用的递归,但是貌似很蠢。普通的迭代就可以

python五行代码 矩阵行列对换:matrix=list(zip(*matrix)), list反转顺序:a=a[::-1]

 

Offer30:包含min函数的栈

辅助栈来确保自己的顶端是数据栈的最小值,用空间来换时间

 

Offer31:判断栈队列

辅助栈来模拟入栈出栈的过程,双循环

 

Offer32:从上到下打印二叉树:

bfs算法,扩展(按层分数组打印),创建一个数组用来记录层数

 

Offer33:二叉搜索树的后序遍历序列

递归分治 复杂度nn,单调栈 复杂度n  需要重点复习

 

Offer34:二叉树中和为某一值的路径

dfs搜索+回溯 python中,如果在递归内引用a.append(b),若b为数组,则传入的是地址,后续对b的改动还会影响到a

需要在dfs中考虑回溯

 

Offer35:复杂链表的复制(深复制)

dfs,bfs都可以,需要用visited来记录避免重复复制。最优解法是原地复制然后再拆分链表,这样空间复杂度是O1

 

Offer36:二叉搜索树转化成双向链表

中序遍历二叉搜索树形成递增链表,能通过大多数测试通不过少数测试大概率是因为终止条件的设置

python函数套层时应注意:list等地址可不用self包装,int等变量需要被self包装否则私有化

 

Offer37:序列化二叉树,反序列化

bfs序列化,dfs反序列化

 

Offer38:字符串的排列(排列组合)

用数组visited来表示所有步骤中的路径来对dfs进行剪枝 (交换法,减少内存占用)

 

Offer39:数组中出现次数超过一半的数字

摩尔投票法

 

Offer40:最小k数

复习快速排序最好的题目

还可以使用最大堆来解--python中的heapq.heapify()是默认最小堆,此时应取负数来维护

 

Offer41:中位数

大小堆:

大【小堆 + 大堆】小

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值