算法题分类总结

刷题建议

  • 对于每道算法题,建议在线编辑刷3次,使用纸笔刷剩余次数
  • 对于面试算法题,建议在面试前抄写3次

动态规划

斐波拉契数列系列题目

斐波那契数列
LintCode: 366. 斐波纳契数列
跳台阶
LintCode: 111. 爬楼梯
变态跳台阶
用2*1的小矩形横着或者竖着去覆盖更大的矩形,请问用8个2*1的小矩形无重叠地覆盖2*8的大矩形,总共有多少种方法?

回溯

经验总结

  • 回溯法通常使用递归实现,类似在矩阵/棋盘中寻址的问题都可以使用回溯法解决

矩阵中的路径

哈希

LeetCode: 1. 两数之和

二分查找

经验总结

  1. 二分中点的确定:int mid = start + (end - start) / 2;

LintCode: 457. 经典二分查找问题
LintCode: 14. 二分查找
LintCode: 585. 山脉序列中的最大值
LintCode: 75. 寻找峰值
旋转数组的最小数字
LintCode: 159. 寻找旋转排序数组中的最小值
LintCode: 160. 寻找旋转排序数组中的最小值 II

排序

LintCode: 463. 整数排序

二叉树

根据遍历结果构造二叉树

LintCode: 72. 中序遍历和后序遍历树构造二叉树
LintCode: 73. 前序遍历和中序遍历树构造二叉树

二叉搜索树与链表的转换

LintCode: 106. 有序链表转换为二分查找树
LintCode: 378. 将二叉查找树转换成双链表
二叉搜索树与双向链表

Top K系列问题

剑指offer: 最小的K个数
LeetCode: 215. 数组中的第K个最大元素

链表

经验总结

假链表头的模拟

// 假链表头模拟的前提是已经处理了真链表头head为null的情况
        // 节点有效性校验
        if (head == null) return null;
        
// 假链表头的模拟
        ListNode fakeHead = new ListNode(0);
        // 假链表头的next指针指向真链表头
        fakeHead.next = head;
        // pre指针指向假链表头
        ListNode pre = fakeHead;
        // cur指针指向真链表头
        ListNode cur = head;
        // 返回假链表头的next指针指向的元素
        return fakeHead.next;

相关题目

LintCode: 113. 删除排序链表中的重复数字 II

修改"引用的指向"和"对象的next指针的指向"的区别

修改"引用的指向"-修改引用的指向,修改之后引用指向了不同的对象
修改"对象的next指针的指向"-修改对象的next指针的指向,修改之后对象的next指针指向不同的对象,一般通过修改对象的next指针的指向来链接新链表

删除链表中的节点

LintCode: 113. 删除排序链表中的重复数字 II

链表中倒数第K个节点

剑指offer: 面试题22. 链表中倒数第K个节点
LintCode: 166. 链表倒数第n个节点
LintCode: 174. 删除链表中倒数第n个节点
求链表的中间节点.如果链表中的节点总数为奇数,则返回中间节点;如果节点总数是偶数,则返回中间两个节点的任意一个.为了解决这个问题,我们也可以定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另一个指针一次走两步.当走得快的指针走到链表的末尾时,走得慢的指针正好在链表的中间

链表环相关问题

LintCode: 102. 带环链表
LintCode: 103. 带环链表 II
剑指offer: 链表中环的入口结点

位运算

经验总结

  • 正数: 原码=反码=补码,负数: 补码=反码+1
  • 左移补0, 右移补符号位(负数可能引起死循环)左移补0, 右移补符号位(负数可能引起死循环)
  • n&(n-1)可用于消除整数的二进制表中最右边的1
  • 2的幂的二进制表示中只有一个1
  • Integer类中与位运算相关的方法
bitCount(int i)-整数i的二进制表示中1的数目
  • Java中不支持将基本数据类型(int)直接转换为boolean型
  • 二进制加法技巧
二进制不计进位相加: sum = num1 ^ num2
二进制进位计算: carry = (num1 & num2) << 1
  • 不使用第三方变量交换两个变量技巧
基于加减法											基于异或运算
a = a + b;											a = a ^ b;
b = a - b;											b = a ^ b;
a = a - b;											a = a ^ b;

二进制中1的个数

剑指offer: 面试题15. 二进制中1的个数
LintCode: 1332. 判断一个整数中有多少个1
剑指offer: 面试题56. 数组中数字出现的次数

2的幂

1314. 2的幂

不用加减乘除做加法

剑指offer: 面试题65. 不用加减乘除做加法

你可能感兴趣的:(algorithm)