目录
(1)使用队列实现栈&&使用栈实现队列(easy&&easy)
一、链表
(1)链表逆序、翻转链表(easy&&medium)
(2)链表求交点(easy)
(3)链表求环(medium)
(4)链表划分(medium)
(5)复杂链表的复制(深度拷贝)(hard)
copy list with random pointer138
(6)排序链表的合并(easy&&hard)
二、栈,队列,堆
(1)使用队列实现栈&&使用栈实现队列(easy&&easy)
232(两个栈实现一个队列)&&225(两个队列实现一个栈)
(2)包含min函数的栈(easy)
Min Stack 155:得到任意时刻栈中的最小值(申请两个栈,一个数据,一个当前最小值,同步进出栈)
(3)简单的计算器(hard)
224只能进行加法减法(switch case判断是数字、加减符号、左右括号)
略复杂,不好想,但是代码简单。要注意加减符号决定正负(一个flag标识),还有字符是否为数字Character.isDigit(c),还有字符串转换为数字cur = 10*cur + s.charAt(++i) - '0';
(4)数组中第K大的数(easy)
首先优先级队列,在java里面默认的是小根堆。(如果需要大根堆,需要自己写一个compare函数)
小根堆,堆顶是K个数的最小值,也就是数组中第K大的数,把数组的数不断放进队列中,数目大于k的时候,把堆顶弹出。
(5)找到数据流中的中位数
一个大根堆和一个小根堆,大根堆里面的数都小于小根堆里面的数。中位数就在两个堆顶中间产生。
三、贪心算法
(1)分配饼干(easy)
(2)摇摆序列(medium)
摇摆序列最长子序列的长度:最高和最底部的时候length++
(3)移除K个数字(medium)
就是说给一个字符串形式的正数,删除k个数字,使得字符串数字最小
(4) 跳跃游戏(medium&&hard)
55:能不能调到最后的位置,需要维护的是当前能够跳的最远的地方
56:last_maxIndex其实是上一步能够到达的最远距离,cur_maxIndex是当前能够到达的最远距离
(5) 射击气球最小射击手数目(medium)
452 Minimum Number of Arrows to Burst Balloons
活动选择问题,会议室选择问题开展最多会议数目,其实一一个类型
将所有的气球按照终止位置排序,开始从前向后扫描。以第一个气球的终止位置为准,只要出现的气球起始位置小于这个气球的终止位置,代表可以一箭使这些气球全部爆炸;当出现一个气球的起始位置大于第一个气球的终止位置时再以这个气球的终止位置为准,找出所有可以再一箭爆炸的所有气球;以此类推
四、递归、回溯与分治
(1)求子集(medium) 回溯
78 Subsets(java) ;80 Subsets II
(2)组合数之和(medium) 回溯
39 combination sum ;40 Combination Sum II;216 Combination Sum III;377 Combination Sum IV
(3)生成括号(medium) 递归
(4)N皇后(hard),回溯
(5)逆序数(hard) 分治,归并
五、二叉树与图
(1)路径之和(m)
(2) 最近的公共祖先节点(m)
(3)二叉树转链表(m)
(4)侧面观察二叉树(宽搜)(m)
(5)课程安排(有向图判断) (m)
六、二分查找与二叉查找树
(1)插入位置(e)
35:给定一个排序数组和一个目标值,如果能够找到这个值,就返回值的坐标,如果找不到,就返回值的插入位置的坐标值
(2) 区间查找(m)
(3)旋转数组查找 (m)
(4)二叉树的编码和解码 (m)
(5)逆序数(h)
315:使用二叉搜索树和归并排序,统计当前数右侧有多少数比它小
七、哈希表与字符串
(1)最长回文串(e 字符哈希)
(2)词语模式(e 字符串哈希)
(3)同字符词语分组(m)
(4)无重复字符的最长子串(m)
3:最长子串,而不是最长子序列。子串是字符串连续的一段,子序列是可以不连续的 所以有一种方法叫做滑动窗口法,我记得左程云老师讲过,那个题是计算窗口内最大或者最小值的
(5)重复的DNA序列(m)
187:可以枚举,将长度为10的子串存入hashmap中,这样其实这个题就是个easy的题
(6)最小窗口子串(h)
76:就是在S中找出包括T的所有字符的最小窗口 ,要求时间复杂度是O(N) 所以有了之前滑动窗口的概念,这个题会好理解一点
八、动态规划
(1)爬楼梯(e)
(2)打家劫舍(e)
(3)最大子段和(e)
(4)找零钱
给定target,找出数组中零钱使用最小张数组成target
(5)三角形
从上往下,只能向下一行相邻的两个地方走,也就是数组对齐后的正下方和右下方,求到达最后一行的最小步长
(6)最长上升子序列
(7)最小路径和
(8)地牢游戏
王子在左上,公主在右下,救公主的过程中可能会掉血,也可能会增加生命值,要求在过程中至少一滴血,问骑士开始营救之前至少多少血
九、搜索
(1)岛屿数量(深搜)
(2)词语阶梯
就是给一个单词词典,给一个开始词汇和结束词汇,在词典中找出开始词汇转变成结束词汇的过程,求转变次数 每次只能转变单词的一个字符
(3)词语阶梯2
跟上一题127一样,但是额外要求要输出搜索的路径,而且是 所有的路径 所以需要考虑将路径转换为有向图,然后将有向图中的最短路径全部枚举出来
(4)火柴棍摆正方形
(5)收集雨水
二维数组存储的是每个单元的高度,求最多接多少体积的雨水 首先想到的就是找到最低点。然后用了广度优先搜索,还有优先级队列的重排序