排序链表
148. 排序链表
给你链表的头结点 head
,请将其按 升序
排列并返回 排序后的链表 。
示例
输入:head = [4,2,1,3]
输出:[1,2,3,4]输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]输入:head = []
输出:[]
给定一个正整数N代表火车数量,0 < N < 10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9 编号,火车站只有一个方向进出,同时停靠在火车站的列车中,只有后进站的出站了,先进站的才能出站。
要求输出所有火车出站的方案,以字典序排序输出。
数据范围:1≤ n ≤10 1 ≤ n ≤10
进阶:时间复杂度:O(n!)
,空间复杂度:O(n)
第一行输入一个正整数N(0 < N <= 10),第二行包括N个正整数,范围为1到10。
输出以字典序从小到大排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行,具体见sample。
这两个通配符是最常用的,其中点号「.」可以匹配任意一个字符,星号「*」
可以让之前的那个字符重复任意次数(包括
0 次)。
比如说模式串".a*b"
就可以匹配文本"zaaab"
,也可以匹配"cb"
;模式串"a..b"
可以匹配文本"amnb"
;而模式串".*"
就比较牛逼了,它可以匹配任何文本。
题目会给我们输入两个字符串s
和p
,s
代表文本,p
代表模式串,请你判断模式串p
是否可以匹配文本s
。我们可以假设模式串只包含小写字母和上述两种通配符且一定合法,不会出现*a
或者b**
这种不合法的模式串,
前缀和技巧适用于快速、频繁地计算一个索引区间内的元素之和。
给定一个整数数组 nums
,处理以下类型的多个查询:
计算索引 left
和right
(包含 left 和
right)之间的 nums 元素的和 ,其中 left <= right 实现 NumArray
类:
nums[left] + nums[left + 1] + ... + nums[right] )
输入:
["NumArray", "sumRange", "sumRange", "sumRange"]
[[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]
输出:
[null, 1, -1, -3]
解释:
NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]);
numArray.sumRange(0, 2); // return 1 ((-2) + 0 + 3)
numArray.sumRange(2, 5); // return -1 (3 + (-5) + 2 + (-1))
numArray.sumRange(0, 5); // return -3 ((-2) + 0 + 3 + (-5) + 2 + (-1))
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开!
数据范围:字符串长度1<= length<=30
进阶:时间复杂度:O(n^3)
,空间复杂度:O(n)
输入:
abcdefghijklmnop abcsafjklmnopqrstuvw
输出:
jklmnop
对于子串问题,大部分都可以通过滑动窗口来解决。说起来滑动窗口的思路非常简单,就是维护一个窗口,不断滑动,然后更新答案。这个算法的时间复杂度为O(N)
,比字符串暴力算法要高效多了,这里我们可以学习下labuladong大神的框架。
1 | /* 滑动窗口算法框架 */ |
通过下面的一道题来深入了解下滑动窗口:
给你k
枚相同的鸡蛋,并可以使用一栋从第 1 层到第 n 层共有
n 层楼的建筑。
已知存在楼层 f ,满足0 <= f <= n
,任何从 高于 f
的楼层落下的鸡蛋都会碎,从 f 楼层或比它低的楼层落下的鸡蛋都不会破。
每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层 x 扔下(满足 1 <= x <= n)。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则可以在之后的操作中 重复使用 这枚鸡蛋。
请你计算并返回要确定f
确切的值
的最小操作次数 是多少?
输入:k = 1, n = 2
输出:2
解释:
鸡蛋从 1 楼掉落。如果它碎了,肯定能得出 f = 0 。
否则,鸡蛋从 2 楼掉落。如果它碎了,肯定能得出 f = 1 。
如果它没碎,那么肯定能得出 f = 2 。
因此,在最坏的情况下我们需要移动 2 次以确定 f 是多少。