剑指offer解题思路总结(笔记)

1.二维数组中的查找思路:
从左下或右上开始,以左下为例,若该数比目标小,则右移,若比目标大,则上移。时间复杂度O(n),暴力法求解时间复杂度为O(n2)。
2.替换空格思路:
先遍历一遍统计空格个数,然后进行第二遍遍历(从后向前),定义两个指针p1和p2,一个指向原始字符串末尾,一个指向替换后的字符串末尾,若p1指向非空格则将p1复制到p2中,然后向前,若遇到空格则p2用对应符号代替,p1向前一格,p2向前三格。时间复杂度O(n),暴力法求解时间复杂度为O(n2)。
3.从头到尾打印链表
先正向输出到vector中,再reverse。第二种思路用栈来收集链表元素。
4.重建二叉树
前序遍历为12473568,中序遍历为47215368,则可知1为根结点,247为1的左子树,3568为1的右子树,递归即可得到完整二叉树。
5.用两个栈实现队列
栈1用来入,栈2用来出,入队操作即入栈1,出队操作先看栈2是否为空,若不为空则栈2栈顶元素出栈,若空则先将栈1所有元素压入栈2再栈2栈顶元素出栈。
6.旋转数组中的最小数字
二分查找即可,left=头,right=尾,如果mid>left则要找的数在右半边,若mid<right则要找的数在左半边。
7.斐波那契数列
1)递归:时间复杂度较大,超时。2)用一个数组记录把每次结果都记录下来。3)用三个变量
8.跳台阶
思路同上
9.变态跳台阶
递归后找到通项公式
10.矩形覆盖
同7、8题,递归时间复杂度过大。
11.二进制中1的个数
bitset函数,或者与1按位与,然后1左移,一位一位判断是不是1。
12.数值的整数次方
pow函数,或沿用上题思路,从最低位开始,遇到1,乘以底数,否则不乘,指数每过一位,底数要翻倍。
13.调整数组顺序使奇数位于偶数前面
利用插排的思想,先找到第一个偶数,然后遍历后面的数,若遇到奇数,向前交换到第一个偶数之前,在这个位置基础上继续向后遍历,直到没有奇数,时间复杂度为O(n2);第二种思路是用两个队列,遇到奇数进一个队列,遇到偶数进一个队列,遍历完后再出队列,时间复杂度和空间复杂度都是O(n)。
14.链表中倒数第k个节点
快慢指针
15.反转链表
第一种思路为用栈,可以保留原链表,第二种思路为快慢指针,快指针比慢指针快1,注意先拆掉最左端节点的next。
16.合并两个排序的链表
归并排序
17.树的子结构
两个函数,函数1判断root2是否为root1的子结构,函数2判断root2是否是root1的子结构且子结构根节点为root1,函数1返回函数2(root1,root2)||函数1(root1->left,root2)||函数1(root1->right,root2),函数2返回函数2(root1->left,root2->left)&&函数2(root1->right,root2->right),函数1root2为空时返回false&

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值