剑指offer整理(待更新)

剑指offer整理(待更新)

Note:根据 牛客网剑指offer 整理的算法题,这里仅收录一些有意思的题目。

  • 算法执行时是线性的过程,但是在思考时是非线性,是带分支的过程
  • 算法有好坏之分
    • 时间复杂度低的算法好
    • 算法归纳性强,能涵盖大多测试用例,且整体思路简单的算法好。
    • 需要细分多种不同类型的测试用例,不停地debug分支条件的算法不好。
    • Java中,使用包装类集合的算法时间开销会比较大,即使计算的算法时间复杂度低,但是实际下拆包和装箱带来时间复杂度会比较高,在做题时,尽量减少包装类的拆包和装箱的操作。参考在二叉树中找到两个节点的最近公共祖先

一、数据结构

1、链表

  • JZ6 从尾到头打印链表,参考题解
    Note
    • 注意链表的头指针不带空值
    • 截断第一个节点,再使用p,q指针反转链表
  • JZ24 反转链表(答案同JZ6一模一样)
  • JZ25 合并两个排序的链表,参考题解
    Note
    • 创建一个带头指针的新链表,每次选两链表最小值插入新链表尾部
    • 分别采用三个指针对list1,list2和插入链表进行遍历。
  • JZ52 两个链表的第一个公共结点(无环),参考题解
    Note
    • 计算两个链表长度,让长的链表先执行len2 - len1步,之后两链表同步遍历
    • 输入分为是3段,注意后台会将这3个参数组装为两个链表,并将这两个链表对应的头节点传入到函数。
  • JZ23 链表中环的入口结点(有环),参考题解
    Note
    • 设置快慢指针,两指针同时从头指针出发,慢指针步长为1,快指针步长为2,找到第一次相遇的节点(第一次相遇的节点并不一定是入口节点)
    • 由于慢指针走了X+Y步,快指针走了2(X+Y)步,而快指针在环路内重复走了两次Y,因此可以设置两个指针,分别从第一次相遇的节点头指针同步出发,再次相遇的节点为入口节点。
    • 注意考虑链表无环的用例
  • JZ22 链表中倒数最后k个结点,参考题解
    Note
    • 如果要让时间复杂度为 O ( n ) O(n) O(n)(求解链表长度方法为 O ( 2 n ) O(2n) O(2n)),则可以设置快慢指针,快指针先走k,接着快慢指针同步,直到快指针走到链尾,输出慢指针即可(慢指针走了len-k步)。

2、树

3、队列 & 栈

二、算法

1、搜索算法

2、动态规划

3、回溯

4、排序

  • JZ51 数组中的逆序对,可参考题解
    Note
    • 如果利用2层for暴力求解会超时。
    • 可以利用归并排序计算元素的交换次数,即为逆序对数目,注意在归并时需要额外开辟一个新的子数组new arr[right - left +1],用于复制原来子区间的数组origin[left,right]
    • 接着利用双指针进行归并,并将结果直接写入原来origin中。

5、位运算

6、模拟

7、其他算法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值