在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
若数组中存在数k
,则其所在行左侧的数小于等于k
,右侧的数大于等于k
,其所在列上方的数小于等于k
,下方的数大于等于k
。故若存在k
,自数组的左下角开始查找,若当前数小于k
,则k
在右侧,否则在上方。
1 | class Solution { |
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
若数组中存在数k
,则其所在行左侧的数小于等于k
,右侧的数大于等于k
,其所在列上方的数小于等于k
,下方的数大于等于k
。故若存在k
,自数组的左下角开始查找,若当前数小于k
,则k
在右侧,否则在上方。
1 | class Solution { |
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
对斐波那契数列,我们有
an=an−1+an−2
考虑矩阵乘法,我们有
[a0b0]×[1110]=[a+b0a0]
故
[an+10an0]=[an0an−10]×[1110]=[1110]n
最后引入快速幂,即
[an+10an0]=[1110]n=([1110]⌊2n⌋)2×[1110]n%2
1 | class Solution { |
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
可知该数组由分别不减的2部分组成,故我们可以采用二分法寻找第二部分的第一个值。
1 | #include <limits> |
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
考虑到每将一个空格替换后,即需要将后续字符后移,并整体扩充2个字节,为了避免不必要的移动和扩充,我们可以先计算替换后的字符串的长度,再自右向左替换空格,此时每个非空格字符仅仅被移动一次,且仅需要对字符串进行一次扩充。
1 | class Solution { |
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
栈为先入后出,队列为先出后入,我们将全部入栈再全部出栈视为函数X
,将全部入队再全部出队视为函数Y
,则Y(seq)=X(X(seq))
。故可使用2个栈,入队时将元素压入栈a,出队时将栈a中的元素全部弹出并压入栈b,再从栈b出栈。
1 | class Solution |
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
可知设a[n]
为n
级台阶的跳法,则a[n+1] = a[n] + a[n-1]
。
令
A=[1110]
有
[a[n+1]0a[n]0]=[a[n]0a[n−1]0]×A=[2010]×An−1
考虑快速幂,有
An=(A⌊2n⌋)2×An%2
故
[a[n+1]0a[n]0]=[2010]×(A⌊2n−1⌋)2×A(n−1)%2
1 | class Solution { |
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
可知中序遍历序列的首位为根节点,而中序遍历的序列中,根节点分隔左、右子树,故可在中序遍历的序列中查找根节点,即得到表示左、右子树的序列,递归至序列长度不大于1。
1 | /** |
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0]xk[1]x...xk[m]
可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
找规律,2、3组合
1 | class Solution { |
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
回溯,DFS/BFS
1 | const int xMove[] = {0, 1, 0, -1}; |
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
回溯,格子的状态(未访问、已向上等),防撞(非未访问则回退)
1 | class Solution { |