目录
1 链表(回到目录)
例1-a,链表逆序-a 206
已知链表的头节点head,将链表逆序。(不可以申请额外的空间)
|
|
例1-b,链表逆序-b 92
已知链表头节点指针head,将链表从位置m到n逆序。(不申请额外空间)
|
|
例2,求两个链表的交点。160(回到目录)
已知链表A的头节点指针headA,链表B的头节点指针headB,两个链表相交,求两个链表交点对应的节点。
方法一:使用std中的set函数
方法二
例3,链表求环。
已知链表中可能存在环,若有环返回环起始节点,否则返回NULL.
方法一:使用set函数
方法二
- 步骤:
- 利用快慢指针求出相遇节点
- 相遇节点和头节点同时出发,相等时就是环的入口。
|
|
例4,链表划分。
已知链表头指针head与数值x,将所有小于X的节点放在大于等于x的节点前,且保持这些节点的原来的顺序。
|
|
例5,链表的深度拷贝。。。。。不想做了
例6-a,排序链表的合并(2个)
已知两个已排序的链表头节点指针$L_1$和$L_2$,将这两个链表合并,合并之后仍为有序的,返回合并后的头节点。
|
|
例6-b,K个排序链表的合并
已知k个已排序链表头节点指针,将这k个链表合并,合并后仍为有序的,返回合并后的头节点。
方法一:将所有的节点放在一个vector,然后再排序,最后相连。
方法二:使用分治法
补充对比:分治算法之归并排序。
|
|
2 栈 队列 堆(回到目录)
例1,使用队列实现栈
使用两个队列设计一个栈。
思路:两个队列中,一个做真正的数据队列,一个用作临时队列。并且只是修改push操作,其他操作不变。
例2,使用栈实现队列
使用两个栈设计一个队列
思路:两个栈中,一个做真正的数据栈,一个用作临时栈。并且只是修改push操作,其他操作不变。
例1例2总结
把握核心:
- 队列实现栈:新来的元素压到队头!
- 栈实现队列:新来的元素压到栈底!
例3,包含min函数的栈
设计一个栈,支持以下操作,这些操作的算法复杂度为常数级,O(1)。
- push(x):将x压入栈中
- pop():弹出栈顶元素
- top():返回栈顶元素
- getMin():返回栈内最小的元素
|
|
例4,合法的出栈序列
已知从1至n的数字序列,按顺序入栈,每个数字入栈后即可出栈,也可在栈中停留,等待后面的数字入栈出栈后,该数字再出栈,求该数字序列的出栈序列是否合法。
|
|
例6,数组中第K大的数字
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例1:
|
|
例7,设计一个数据结构,该数据结构可以动态的维护一组数据,且支持如下操作:
(1) 添加元素
(2) 返回数据的中位数
补充内容
3 贪心算法(回到目录)
例1,分糖果。已知一些孩纸和糖果,每个孩子都有需求因子g,每个糖果有大小s,当糖果的大小s>=g时,代表糖果可以满足该孩子;求使用这些糖果,最多能满足多少个孩子?(每个孩子最多使用一个糖果)
|
|
例2,摇摆序列。一个整数序列,如果两个相邻的元素的差恰好正负(负正)交替出现,则该序列被称为摇摆序列。一个小于2个元素的序列直接为摇摆序列。
|
|
例3,移除k个数字。已知一个使用字符串表示的非负整数num,将num中的k个数字移除,求移除k个数字后,获得的最小的可能的数字。
|
|
例4-a,一组数据存储了非负整数,数组中的第i个元素a[i],代表了可以从数组第i个位置最多向前跳跃a[i]步;已知数组各元素的情况下,求是否可以从数组中的第0个位置跳跃到最后一个元素的位置?
|
|
(还要复习)例4-b,一个数组存储了非负整数,数组中的第i个元素a[i],代表了可以从数组第i个位置最多向前跳跃a[i]步;已知数组各元素的情况下,确认可以从第0位置跳跃到数组最后一个位置,求最少需要跳跃几次?
|
|
例5,射击气球。已知在一个平面上有一定数量的气球,平面可以看作一个坐标系,在平面的x轴的不同位置安排弓箭手向y轴射击,弓箭可以向y轴走无穷远;给定气球的宽度(xstart,xend),问至少需要多少弓箭手,将全部气球打爆?
|
|
(还要复习)例6,最优加油方法。已知一条公路上,有个起点和终点,这之间有n个加油站;已知从这n个加油站到终点的距离d与各个加油站的加油量1,起点位置至终点的距离L与起始时刻油箱中的汽油量P;假设使用1个单位的汽油即走1个单位的距离,油箱没有上限,最少加几次油,可以从起点开至终点?
|
|
4 递归 回溯与分治(回到目录)
[toc]
例1-a,求子集。已知一组数(其中无重复元素),求这组数可以组成的所有子集。结果中不可以有重复的子集。
|
|
另一种写法
例1-b,求子集2。已知一组数(其中有重复元素),求这组数可以组成的所有子集。结果中无重复的子集。
|
|
例1-c,组合数之和。已知一组数(其中有重复元素),求这组数可以组成的所有子集中,子集的各个元素和为整数target的子集,结果中无重复元素。
方法1
方法2
例2,生成括号,已知n组括号,开发一个程序,生成这n组括号所有合法的组合可能。
|
|
例3,N皇后。
|
|
例4,求逆序数。已知数组nums,求新数组count,count[i]代表了在nums[i]右侧且比nums[i]小的元素个数。
|
|
预备知识。归并排序。
已知两个排序数组,将这两个数组合并为一个排序数组。
|
|
对一个数组进行归并排序。
|
|
5 二叉树与图(回到目录)
二分查找的两种方法
方法1(递归)
|
|
方法2(循环)
|
|
例1,插入位置。给定一个排序数组nums(无重复元素)与目标值target,如果target在nums里出现,则返回target所在下标,如果target未在nums中出现,则返回target应该插入的位置的数组下标,使得将target插入数组后,数组仍然有序。
|
|
例2,区间查找。给定一个排序数组nums(有重复元素)与目标值target,如果target在nums里出现,则返回target所在区间的左右断电下标([左,右]),如果target在nums里未出现,则返回[-1,-1]
|
|
例3,旋转数组。给定一个排序数组nums(没有重复元素),且nums可能以某个未知下标旋转,给定目标值target,求target是否在nums中出现,若出现返回所在下标,未出现返回-1。
|
|
例4,二叉查找树编码和解码。给定一个二叉查找树,实现对该二叉树编码与解码功能。编码即将该二查找树转为字符串,解码即将字符串转为二叉查找树。不限制使用何种编码算法,只需保证当对二叉查找树调用编码功能后可再调用解码功能将其复原。
|
|
6 二分查找与二叉查找树(回到目录)
二分查找的两种方法
方法1(递归)
|
|
方法2(循环)
|
|
例1,插入位置。给定一个排序数组nums(无重复元素)与目标值target,如果target在nums里出现,则返回target所在下标,如果target未在nums中出现,则返回target应该插入的位置的数组下标,使得将target插入数组后,数组仍然有序。
|
|
例2,区间查找。给定一个排序数组nums(有重复元素)与目标值target,如果target在nums里出现,则返回target所在区间的左右断电下标([左,右]),如果target在nums里未出现,则返回[-1,-1]
|
|
例3,旋转数组。给定一个排序数组nums(没有重复元素),且nums可能以某个未知下标旋转,给定目标值target,求target是否在nums中出现,若出现返回所在下标,未出现返回-1。
|
|
例4,二叉查找树编码和解码。给定一个二叉查找树,实现对该二叉树编码与解码功能。编码即将该二查找树转为字符串,解码即将字符串转为二叉查找树。不限制使用何种编码算法,只需保证当对二叉查找树调用编码功能后可再调用解码功能将其复原。
|
|
7 哈希表与字符串(回到目录)
例1,最长回文串。已知一个只包括大小写字符的字符串,求用该字符串中的字符可以生成的最长回文字符串长度。
|
|
补充,leetcode 5:最长回文子串
超出时间限制的做法
例2,已知字符串pattern与字符串str,确认str是否与pattern匹配。str与pattern匹配代表字符串str中的单词与pattern中的字符一一对应。(其中pattern中只包含小写字符,str中的单词只包含小写字符,使用空格分隔)
|
|
例3,同字符词语分组。已知一组字符串,将所有anagram(由叠倒字母顺序而构成的字)放在一起输出。
例如:[“eat”,”tea”,”tan”,”ate”,”nat”,”bat”]
返回:[[“ate,”eat],”tea”],[“nat”,”tan”],[“bat”]]
方法1
方法2
例4,无重复字符的最长字串。已知一个字符串,求用该字符串的无重复字符的最长字串的长度。
|
|
例5,重复的DNA序列。将DNA序列看作是只包含[‘A’,’C’,’G’,’T’]4个字符的字符串,给一个DNA字符串,找到所有长度为10的且出现超过1次的子串。
方法1
方法2:使用编码
例6,已知字符串S与字符串T,求S中的最小窗口(区间),使得这个区间中包含了字符T中的所有字符。
例如:S=”ADOBECODEBANC”;T=”ABC”。包含T的子区间中,有“ADOBEC”,”CODEBA”,”BANC”等等;最小窗口的区间是“BANC”.
|
|
8 搜索(回到目录)
9 动态规划(回到目录)
例3,给定一个数组,求这个数组的连续子数组中,最大的那一段的和。如数组【-2,1,-3,4,-1,2,1,-5,4】
|
|
例5,给定一个二维数组,其保存了一个数字三角形,求从数字三角形顶端到底端各数字和最小的路径之和,每次可以向下走相邻的两个位置。
|
|
例6,已知一个未排序的数组,求这个数组的最长上升子序列的长度。例如:【1,3,2,3,1,4】,其中【1,3】,【1,2,3】,【1,2,3,4】都是它的上升子序列。
|
|
例7,已知一个二维数组,其中存储了非负整数,找到从左上角到右下角的一条路径,使得路径上的和最小。(移动过程中只能向下或者向右)
|
|
例8,地下城游戏。一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。
骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。
有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。
为了尽快到达公主,骑士决定每次只向右或向下移动一步。