Java 集合用法
链接 |
---|
Java ArrayList和Array常用方法 |
Java String常用方法 |
Java Stack,Queue,PriorityQueue,deque相关操作 |
Java 输入输出 |
Java Map的常用方法 |
Java Set详解 |
数组
系列 | 链接 | 备注 |
---|---|---|
剑指offer | 剑指offer系列——1.二维数组中的查找 | |
剑指offer | 剑指offer系列——13.调整数组顺序使奇数位于偶数前面 | |
剑指offer | 剑指offer系列——19.顺时针打印矩阵 | |
剑指offer | 剑指offer系列——28.数组中出现次数超过一半的数字 | |
剑指offer | 剑指offer系列——30.连续子数组的最大和 | 动态规划(更好)或分治法(太复杂) |
剑指offer | 剑指offer系列——32.把数组排成最小的数 | |
剑指offer | 剑指offer系列——45.扑克牌顺子 | |
剑指offer | 剑指offer系列——50.数组中重复的数字 | * |
剑指offer | 剑指offer系列——51.构建乘积数组 | |
LeetCode | LeetCode——candy | |
LeetCode | LeetCode——gas-station | |
LeetCode | LeetCode——longest-consecutive-sequence | |
LeetCode | LeetCode——字母异位词分组 | |
LeetCode | LeetCode——缺失的第一个正数 | |
LeetCode | LeetCode——寻找两个有序数组的中位数 | |
LeetCode | LeetCode——第三大的数 | |
LeetCode | LeetCode——使数组唯一的最小增量 | hash冲突的线性探测,路径压缩 |
LeetCode | LeetCode——三维形体的表面积 |
链表
找链表的中点:
ListNode slow = head;
ListNode fast = head.next;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
系列 | 链接 | 备注 |
---|---|---|
剑指offer | 剑指offer系列——3.从尾到头打印链表 | |
剑指offer | 剑指offer系列——14.链表中倒数第k个结点 | 典型双指针问题 |
剑指offer | 剑指offer系列——15.反转链表 | *这个是个更典型的递归问题。 |
剑指offer | 剑指offer系列——16.合并两个排序的链表 | |
剑指offer | 剑指offer系列——25.复杂链表的复制 | |
剑指offer | 剑指offer系列——36.两个链表的第一个公共结点 | |
剑指offer | 剑指offer系列——55.链表中环的入口结点 | |
剑指offer | 剑指offer系列——56.删除链表中重复的结点 | |
LeetCode | LeetCode——sort-list | |
LeetCode | LeetCode——insertion-sort-list | |
LeetCode | LeetCode——reorder-list | |
LeetCode | LeetCode——swap-nodes-in-pairs | |
LeetCode | LeetCode——两数相加 | |
LeetCode | LeetCode——回文链表 | 重点:reverse |
二叉树
系列 | 链接 | 备注 |
---|---|---|
总结 | LeetCode——二叉树遍历 | * |
总结 | LeetCode——N叉树的遍历 | |
剑指offer | 剑指offer系列——4.重建二叉树(前序中序确定树/中序后序确定树) | * |
剑指offer | 剑指offer系列——17.树的子结构 | |
剑指offer | 剑指offer系列——18.二叉树的镜像 | |
剑指offer | 剑指offer系列——22.从上往下打印二叉树 | |
剑指offer | 剑指offer系列——23.二叉搜索树的后序遍历序列 | |
剑指offer | 剑指offer系列——26.二叉搜索树与双向链表 | * |
剑指offer | 剑指offer系列——24.二叉树中和为某一值的路径 | |
剑指offer | 剑指offer系列——38.二叉树的深度 | |
剑指offer | 剑指offer系列——39.平衡二叉树 | |
剑指offer | 剑指offer系列——57.二叉树的下一个结点 | * |
剑指offer | 剑指offer系列——58.对称的二叉树 | |
剑指offer | 剑指offer系列——59.按之字形顺序打印二叉树 60.把二叉树打印成多行 |
|
剑指offer | 剑指offer系列——61.序列化二叉树 | * |
LeetCode | LeetCode——序列化和反序列化 N 叉树 | |
剑指offer | 剑指offer系列——62.二叉搜索树的第k个结点 | |
LeetCode | Leetcode——minimum-depth-of-binary-tree | |
LeetCode | LeetCode——binary-tree-maximum-path-sum | |
LeetCode | LeetCode——populating-next-right-pointers-in-each-node | |
LeetCode | LeetCode——排序数组/链表转平衡二叉搜索树 | |
LeetCode | LeetCode——验证二叉查找树 | |
LeetCode | LeetCode——二叉树的最近公共祖先 | |
LeetCode | LeetCode——删除二叉搜索树中的节点 | |
LeetCode | LeetCode——二叉树的右视图 | |
LeetCode | LeetCode——将二叉搜索树变平衡 | 中序+排序数组/链表转平衡二叉搜索树 |
LeetCode | LeetCode——修剪二叉搜索树 | |
LeetCode | LeetCode——不同的二叉搜索树 II | |
LeetCode | LeetCode——最大二叉树 |
动态规划
字符串
系列 | 链接 | 备注 |
---|---|---|
剑指offer | 剑指offer系列——2.替换空格 | |
剑指offer | 剑指offer系列——34.第一个只出现一次的字符 | |
剑指offer | 剑指offer系列——43.左旋转字符串 | 典型两次翻转 |
剑指offer | 剑指offer系列——44.翻转单词顺序列/翻转字符串里的单词 | |
剑指offer | 剑指offer系列——49.把字符串转换成整数 | |
剑指offer | 剑指offer系列——53.表示数值的字符串 | |
LeetCode | LeetCode——valid-palindrome | |
LeetCode | LeetCode——longest-common-prefix | 1.分治法 2.字典树 |
LeetCode | LeetCode——simplify-path | |
面试金典 | 面试金典——模式匹配 | |
LeetCode | LeetCode——设计搜索自动补全系统 | 也可以用字典树 |
LeetCode | LeetCode——统计重复个数 | |
面试金典 | 面试金典——字符串压缩 | |
LeetCode | LeetCode——删除字符串中的所有相邻重复项 II | |
LeetCode | LeetCode——字符串相乘 | |
LeetCode | LeetCode——判断子序列 |
图(DFS,BFS,回溯)
递归
系列 | 链接 | 备注 |
---|---|---|
剑指offer | 剑指offer系列——7.斐波拉契数列 | |
剑指offer | 剑指offer系列——8.跳台阶 9.变态跳台阶 | |
剑指offer | 剑指offer系列——10.矩阵覆盖 | |
剑指offer | 剑指offer系列——15.反转链表 | * |
LeetCode | LeetCode——字符串解码 | 递归或栈 |
栈,队列
系列 | 链接 | 备注 |
---|---|---|
剑指offer | 剑指offer系列——5.用两个栈实现队列/队列实现栈 | * |
剑指offer | 剑指offer系列——20.包含min函数的栈 | |
剑指offer | 剑指offer系列——21.栈的压入、弹出系列 | |
剑指offer | 剑指offer系列——54.字符流中第一个不重复的字符 | |
剑指offer | 剑指offer系列——63.数据流中的中位数 | |
剑指offer | 剑指offer系列——64.滑动窗口的最大值 | |
LeetCode | LeetCode——evaluate-reverse-polish-notation | |
LeetCode | LeetCode——每日温度 | 单调栈 |
LeetCode | LeetCode——largest-rectangle-in-histogram | * |
LeetCode | LeetCode——longest-valid-parentheses | |
LeetCode | LeetCode——不同字符的最小子序列/去除重复字母 |
位运算/数学问题
系列 | 链接 | 备注 |
---|---|---|
剑指offer | 剑指offer系列——11.二进制中1的个数 | * |
剑指offer | 剑指offer系列——12.数值的整数次方 | 尤其是快速幂和快速乘的复习* |
剑指offer | 剑指offer系列——31.整数中1出现的次数 | * |
剑指offer | 剑指offer系列——33.丑数 | |
剑指offer | 剑指offer系列——40.数组中只出现一次的数字 | |
剑指offer | 剑指offer系列——47.求1+2+……+n* | |
剑指offer | 剑指offer系列——48.不用加减乘除做加法* | |
剑指offer | 剑指offer系列——67.剪绳子 | |
LeetCode | LeetCode——max-points-on-a-line | |
LeetCode | LeetCode——gray-code | |
LeetCode | LeetCode——阶乘后的零 | |
LeetCode | LeetCode——reverse-integer | |
面试金典 | 面试金典——交点 | |
LeetCode | LeetCode——矩形重叠 | |
LeetCode | LeetCode——数字转换为十六进制数 | * |
LeetCode | LeetCode——最大单词长度乘积 | |
LeetCode | LeetCode——最小移动次数使数组元素相等 |
双指针/滑动窗口
若是固定滑动窗口,应先增大窗口,再缩小窗口,再对窗口内部进行处理。
int left=0,right = 0;
while(right<s.length){
window.add(s[right]);
right++;
while(right-left>k){
window.remove(s[left]);
left++;
}
if(right-left==k){
window处理
}
}
系列 | 链接 | 备注 |
---|---|---|
剑指offer | 剑指offer系列——14.链表中倒数第k个结点 | |
剑指offer | 剑指offer系列——41.和为S的连续正数序列 | |
剑指offer | 剑指offer系列——42.和为S的两个数字 | |
LeetCode | LeetCode——longest-substring-without-repeating-characters | 动态规划也可以 |
LeetCode | LeetCode——最小覆盖子串 | * |
LeetCode | LeetCode——字符串的排列/找到字符串中所有字母异位词 | * |
LeetCode | LeetCode——滑动窗口中位数 | 中位数参考:数据流中的中位数 |
LeetCode | LeetCode——至多包含 K 个不同字符的最长子串 |
排序/区间合并
系列 | 链接 | 备注 |
---|---|---|
总结 | 排序算法汇总 | * |
剑指offer | 剑指offer系列——27.字符串的排序(全排序) | 字典排序 |
剑指offer | 剑指offer系列——29.最小的K个数 | |
LeetCode | LeetCode——分类颜色 | 计数排序 |
LeetCode | LeetCode——Maximum Gap 最大间隙问题 | 桶排序、基数排序* |
LeetCode | LeetCode——无重叠区间 | 区间调度问题,贪心算法 |
LeetCode | LeetCode——用最少数量的箭引爆气球 | 贪心算法 |
LeetCode | LeetCode——煎饼排序 | |
LeetCode | LeetCode——insert-interval | |
LeetCode | LeetCode——merge-k-sorted-lists | 堆排序 |
LeetCode | LeetCode——合并区间 | |
LeetCode | LeetCode——区间交集 | |
LeetCode | LeetCode——俄罗斯套娃信封问题 | |
LeetCode | LeetCode——递增的三元子序列 |
二分法/分治法(归并)
二分公式:
1、分析二分查找代码时,不要出现 else,全部展开成 else if 方便理解。
2、注意「搜索区间」和 while 的终止条件,如果存在漏掉的元素,记得在最后检查。
3、如需定义左闭右开的「搜索区间」搜索左右边界,只要在nums[mid] == target时做修改即可,搜索右侧时需要减一。
4、如果将「搜索区间」全都统一成两端都闭,好记,只要稍改nums[mid] == target条件处的代码和返回的逻辑即可.
int binary_search(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while(left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
} else if(nums[mid] == target) {
// 直接返回
return mid;
}
}
// 直接返回
return -1;
}
int left_bound(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
} else if (nums[mid] == target) {
// 别返回,锁定左侧边界
right = mid - 1;
}
}
// 最后要检查 left 越界的情况
if (left >= nums.length || nums[left] != target)
return -1;
return left;
}
int right_bound(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
} else if (nums[mid] == target) {
// 别返回,锁定右侧边界
left = mid + 1;
}
}
// 最后要检查 right 越界的情况
if (right < 0 || nums[right] != target)
return -1;
return right;
}
系列 | 链接 | 备注 |
---|---|---|
剑指offer | 剑指offer系列——6.旋转数组的最小数字/搜索旋转排序数组 | * |
剑指offer | 剑指offer系列——35.数组中的逆序对 | * |
剑指offer | 剑指offer系列——37.数字在排序数组中出现的次数 LeetCode——在排序数组中查找元素的第一个和最后一个位置 |
典型二分查找* |
LeetCode | LeetCode——计算右侧小于当前元素的个数 | 分治法 |
LeetCode | LeetCode——搜索插入位置 | |
LeetCode | LeetCode——最长上升子序列/最长递增子序列的个数 | *也可以动态规划 |
LeetCode | LeetCode——分割数组的最大值 | 也可以动态规划 |
LeetCode | LeetCode——x 的平方根/有效的完全平方数 | 二分法,递推法,牛顿法 |
特殊结构或算法
系列 | 链接 | 备注 |
---|---|---|
总结 | LeetCode——多线程问题汇总 | * |
剑指offer | 剑指offer系列——46.孩子们的游戏(圆圈中最后剩下的数) | 约瑟夫环 |
LeetCode | LeetCode——LRU Cache | *LRU |
LeetCode | LeetCode——Nim游戏 | |
LeetCode | LeetCode——strStr | KMP算法* |
LeetCode | LeetCode——实现Trie | 字典树 |
LeetCode | LeetCode——朋友圈 | 并查集 |
LeetCode | LeetCode——冗余连接/以图判树 | 并查集 |
LeetCode | LeetCode——区域和检索-数组可修改 | 线段树 |
LeetCode | LeetCode——电灯开关 | |
LeetCode | LeetCode——最长重复子串 | Rabin-Karp 字符串编码 |
LeetCode | LeetCode——覆盖 | 匈牙利算法 |
LeetCode | LeetCode——打乱数组 | 洗牌算法 |
LeetCode | LeetCode——链表随机节点/随机数索引 | 蓄水池算法 |
LeetCode | LeetCode——哲学家进餐问题 | 经典信号量问题 |
LeetCode | LeetCode——不同的二叉搜索树 | 卡特兰数 |
LeetCode | LeetCode——找到小镇的法官 | 七桥问题 |