目录
(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
活动选择问题,会议室选择问题开展最多会议数目,其实一一个类型
将所有的气球按照终止位置排序,开始从前向后扫描。以第一个气球的终止位置为准,只要出现的气球起始位置小于这个气球的终止位置,代表可以一箭使这些气球全部爆炸;当出现一个气球的起始位置大于第一个气球的终止位置时再以这个气球的终止位置为准,找出所有可以再一箭爆炸的所有气球;以此类推