做算法题之前要先列出所有的边界情况再考虑核心解法,显然,能囊括所有情况的核心解法是才是解决算法题的关键,另外算法的时间复杂度和空间复杂度的优化才是进一步的进阶
算法题中各种边界情况
这个问题需要不断的积累,而且边界情况思考的角度还要看问题是什么类型,这里只是做一些笔记做积累。最后的做题习惯是:开始确定核心解法前先在草稿纸上列出所有的情况
空
- 字符串为空
- 数组为空
数字方面
- 数字为0
- 数字为负数
具体例子
- 315转为"三百一十五":需要考虑到 50036和50005的情况
- 回文串:需要考虑"cac"和"acca"和"ccc"和"dddd"等多种可能
- ["flower","flow","flight"]返回最长公共前缀"fl":需要考虑到数组只有一项的情况,退出条件是其中某一项读到undefined
奇偶情况的考虑
时间复杂度的优化
- 哈希表查找代替数组查找(O(1)>O(n))
- 二分查找代替数组查找(O(logn)>O(n))
空间复杂度的优化
- 变量替换代替另外建数组/栈(O(1)>O(n))
- 对于积累结果求最值的:先维护一个
max值,每次计算得到的结果都与max值进行比较(大则替换max值),这样就不用另外建一个数组然后再找最大值(O(1)>O(n))
综合考虑
有时时间复杂度的优化相对着的空间复杂度的损耗,同理空间复杂度的优化相对着的时间复杂度的损耗,所以要视具体问题具体分析