剑指笔记
3 二维数组中的查找
题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
题解思路
这样一个二维数组,每一行的最右都是此行的最大值,也是此列的最小值,从右上角开始遍历的话,分如下情况讨论:
- 若此元素比目标元素小,则说明目标元素不在此行
- 若此目标比目标元素大,则说明目标元素不在此列
- 每次判断都可以抛弃掉一行或者一列,时间复杂度为O(行长度+列长度)
双栈操作当做队列
分析:
- 假如栈1压入ABC,要弹出A,则需要将ABC全部再压一遍入栈2中
- 此时弹出A,栈2从上到下为BC,则如果要弹出BC则可以直接弹
- 如果要压栈,全部加入栈1
- 所以可以得到逻辑
- 压栈全部压入栈1
- 出栈时判断栈2是否为空
- 若栈2为空,则将栈1的全部元素出栈再压入栈2
- 若栈2不空,则直接弹出栈2
斐波那契数列
1.常规解法 递归
- 时间复杂度O(2的n次)
- 空间复杂度O(1)
2.优化,递归算法由于多次重复计算了相同的数据,我们可以将这些数据存起来
- 将每个都存在数组中,下一个数组调用前两个即可
- 时间复杂度O(N)
- 空间复杂度O(N)
3.空间优化,由于只需要保存前两位,所以我们开一个三位长的数组即可
- 时间复杂度O(n)
- 空间复杂度O(1)
跳台阶
只能跳一层或者两层
- 跳到n层台阶=跳到n-1层的方法数+跳到n-2层的方法数
- n级台阶就相当于n-1级再跳一次一阶的和n-2级再跳一次2阶的
一次可以跳(1-n)层
- F(N)=F(N-1)+F(N-2)+…+F(1)
- F(N-1)=F(N-2)+…+F(1)
- 两式相减,可得F(n)=2*F(n-1)